Was ist Asynchroner Methodenaufruf?
Ein asynchroner Methodenaufruf ist eine in der .NET-Programmierung verwendete Methode, die unmittelbar vor dem Abschluss der Verarbeitung und ohne den aufrufenden Thread zu blockieren, zum Aufrufer zurückkehrt.
Wenn eine Anwendung eine asynchrone Methode aufruft, kann sie gleichzeitig mit der Ausführung der asynchronen Methode ausgeführt werden, die ihre Aufgabe ausführt. Eine asynchrone Methode wird in einem Thread ausgeführt, der vom Hauptanwendungs-Thread getrennt ist. Die Verarbeitungsergebnisse werden durch einen anderen Aufruf eines anderen Threads abgerufen.
Asynchrone Methoden helfen, die Ausführung von Ressourcen zu optimieren, was zu einer skalierbaren Anwendung führt. Diese werden verwendet, um zeitraubende Aufgaben wie das Öffnen großer Dateien, das Herstellen einer Verbindung mit Remotecomputern, das Abfragen einer Datenbank, das Aufrufen von Webdiensten und ASP.NET-Webformularen auszuführen.
Der asynchrone Methodenaufruf kann auch als asynchroner Methodenaufruf (AMI) bezeichnet werden.
Die asynchrone Methode unterscheidet sich von der synchronen Methode in der Art und Weise, in der sie vom Aufruf zurückkehrt. Während ein asynchroner Methodenaufruf sofort zurückkehrt und dem aufrufenden Programm erlaubt, andere Operationen auszuführen, warten synchrone Methodenaufrufe auf den Abschluss der Methode, bevor sie mit dem Programmablauf fortfahren.
Das .NET-Framework verfügt über eine integrierte asynchrone Infrastruktur, sodass jede Methode asynchron aufgerufen werden kann, ohne den Code zu ändern.
.NET Framework bietet zwei Entwurfsmuster zum Implementieren der asynchronen Methode, die asynchrone Delegaten (IASyncResult-Objekte) und Ereignisse verwenden. Das Muster von asynchronen Delegaten ist komplexer und bietet Flexibilität, wodurch es für verschiedene komplexe Programmiermodelle geeignet ist. Das ereignisbasierte Modell ist einfach und sollte in den meisten Fällen verwendet werden.
Im Muster der asynchronen Delegierten verwendet ein Delegatobjekt zwei Methoden: BeginInvoke und EndInvoke. BeginInvoke hat eine Liste von Parametern, die der umschlossenen Funktion ähnlich sind, zusammen mit zwei zusätzlichen optionalen Parametern; Es gibt das IAsyncResult-Objekt zurück. EndInvoke gibt zwei Parameter (out und ref type) zusammen mit dem IAsyncResult-Objekt zurück. BeginInvoke wird zum Initiieren des asynchronen Aufrufs verwendet, während EndInvoke zum Abrufen der Ergebnisse des asynchronen Aufrufs verwendet wird.
Ereignisbasierte asynchrone Muster verwenden eine Klasse mit mindestens einer Methode namens MethodNameAsync, die über entsprechende synchrone Versionen verfügt, die im aktuellen Thread ausgeführt werden. Ereignisbasierte Muster können auch eine MethodNameCompleted-Methode und eine MethodNameAsyncCancel-Methode enthalten. Dieses Muster ermöglicht der Klasse die Kommunikation mit ausstehenden asynchronen Operationen mithilfe des Delegate-Ereignismodells.
Im Folgenden finden Sie einige Tipps zu asynchronen Methoden:
Für hohe Parallelität müssen asynchrone Methoden vermieden werden
Vorsicht ist geboten, wenn gemeinsame Objektverweise übergeben werden
EndXXX (aufgerufen am Ende einer asynchronen Operation) muss aufgerufen werden, um Ausnahmen erneut auszulösen und Fehler zu vermeiden
Wenn alle Ausnahmeobjekte in der asynchronen Methode abgefangen und gespeichert werden, kann sie während des EndXXX-Aufrufs erneut ausgelöst werden
Steuerelemente in der Benutzeroberfläche, die lang andauernde asynchrone Vorgänge initiieren, müssen deaktiviert werden, wenn sie nur für diesen Zweck benötigt werden
Asynchrone Methoden müssen mit einem Verständnis von Multithreading implementiert werden und wo sie sich als effizienter erweisen als die Verwendung von synchronen Methoden.