Asynchrones Programmiermodell (APM)
Ein asynchroner Vorgang, der das IAsyncResult-Entwurfsmuster verwendet, wird als zwei Methoden namens BeginOperationName
und EndOperationName
implementiert, die den asynchronen Vorgang OperationName starten bzw. beenden. Die FileStream -Klasse stellt z. B. die Methoden BeginRead und EndRead zum asynchronen Lesen von Bytes aus einer Datei bereit. Diese Methoden implementieren die asynchrone Version der Read -Methode.
Hinweis
Ab .NET Framework 4 stellt die Task Parallel Library ein neues Modell für die asynchrone und parallele Programmierung bereit. Weitere Informationen finden Sie unter Task Parallel Library (TPL) und Aufgabenbasiertes asynchrones Muster (TAP, Task-based Asynchronous Pattern).
Nach dem Aufruf von BeginOperationName
kann eine Anwendung das Ausführen von Anweisungen für den aufrufenden Thread fortsetzen, während der asynchrone Vorgang in einem anderen Thread ausgeführt wird. Für jeden Aufruf von BeginOperationName
sollte die Anwendung auch EndOperationName
aufrufen, um die Ergebnisse des Vorgangs abzurufen.
Starten eines asynchronen Vorgangs
Die Methode BeginOperationName
startet den asynchronen Vorgang OperationName und gibt ein Objekt zurück, das die IAsyncResult-Schnittstelle implementiert. IAsyncResult -Objekte speichern Informationen zu einem asynchronen Vorgang. In der folgenden Tabelle werden Informationen zu einem asynchronen Vorgang angezeigt.
Member | Beschreibung |
---|---|
AsyncState | Ein optionales, anwendungsspezifisches Objekt, das Informationen über die asynchrone Operation enthält. |
AsyncWaitHandle | Ein WaitHandle , mit dem die Ausführung der Anwendung blockiert werden kann, bis der asynchrone Vorgang abgeschlossen ist. |
CompletedSynchronously | Ein Wert, der angibt, ob der asynchrone Vorgang in dem zum Aufrufen von BeginOperationName verwendeten Thread anstatt in einem separaten ThreadPool-Thread abgeschlossen wurde. |
IsCompleted | Ein Wert, der angibt, ob der asynchrone Vorgang abgeschlossen wurde. |
Eine BeginOperationName
-Methode übernimmt jeden in der Signatur der synchronen Version der Methode deklarierten Parameter, der als Wert oder Verweis übergeben wird. out-Parameter sind nicht Teil der BeginOperationName
-Methodensignatur. Die BeginOperationName
-Methodensignatur umfasst auch zwei weitere Parameter. Der erste dieser Parameter definiert einen AsyncCallback -Delegat, der auf eine Methode verweist, die bei Beendigung des asynchronen Aufrufs aufgerufen wird. Der Aufrufer kann null
angeben (Nothing
in Visual Basic), wenn nach Abschluss des Vorgangs keine Methode aufgerufen werden soll. Der zweite zusätzliche Parameter ist ein benutzerdefiniertes Objekt. Dieses Objekt kann verwendet werden, um anwendungsspezifische Informationen an die Methode zu übergeben, die aufgerufen wird, wenn der asynchrone Vorgang abgeschlossen ist. Wenn eine BeginOperationName
-Methode zusätzliche vorgangsspezifische Parameter übernimmt, z.B. ein Bytearray zum Speichern der aus einer Datei gelesenen Bytes, sind AsyncCallback und das Anwendungszustandsobjekt die letzten Parameter in der BeginOperationName
-Methodensignatur.
BeginOperationName
gibt die Kontrolle sofort an den aufrufenden Thread zurück. Wenn die BeginOperationName
-Methode Ausnahmen auslöst, erfolgt die Auslösung, bevor der asynchrone Vorgang gestartet wird. Wenn die BeginOperationName
-Methode Ausnahmen auslöst, wird die Rückrufmethode nicht aufgerufen.
Beenden eines asynchronen Vorgangs
Die EndOperationName
-Methode beendet den asynchronen Vorgang OperationName. Der Rückgabewert der EndOperationName
-Methode weist denselben Typ auf, der von seiner synchronen Entsprechung zurückgegeben wird, und ist spezifisch für den asynchronen Vorgang. Die EndRead -Methode gibt die Anzahl der aus FileStream gelesen Bytes zurück, während die EndGetHostByName -Methode ein IPHostEntry -Objekt zurückgibt, das Informationen zu einem Hostcomputer enthält. Die EndOperationName
-Methode übernimmt jeden in der Signatur der synchronen Version der Methode deklarierten out- oder ref-Parameter. Zusätzlich zu den Parametern der synchronen Methode umfasst die EndOperationName
-Methode auch einen IAsyncResult-Parameter. Aufrufer müssen die vom entsprechenden Aufruf zurückgegebene Instanz an BeginOperationName
übergeben.
Wenn der durch das IAsyncResult-Objekt dargestellte asynchrone Vorgang nicht abgeschlossen ist, wenn EndOperationName
aufgerufen wird, blockiert EndOperationName
den aufrufenden Thread, bis der asynchrone Vorgang abgeschlossen ist. Vom asynchronen Vorgang ausgelöste Ausnahmen werden von der EndOperationName
-Methode ausgelöst. Die Auswirkung eines mehrmaligen Aufrufs der EndOperationName
-Methode mit demselben IAsyncResult ist nicht definiert. Der Aufruf der EndOperationName
-Methode mit einem IAsyncResult, das nicht von der zugehörigen Begin-Methode zurückgegeben wurde, ist ebenfalls nicht definiert.
Hinweis
Für beide nicht definierten Szenarien sollten die für die Implementierung zuständigen Personen das Auslösen von InvalidOperationExceptionerwägen.
Hinweis
Implementierer dieses Entwurfsmusters sollten den Aufrufer benachrichtigen, dass der asynchrone Vorgang abgeschlossen ist, indem IsCompleted auf „True“ festgelegt, die asynchrone Rückrufmethode aufgerufen (sofern diese angegeben wurde) und AsyncWaitHandlesignalisiert wird.
Anwendungsentwickler verfügen über mehrere Entwurfsoptionen für den Zugriff auf die Ergebnisse des asynchronen Vorgangs. Die richtige Wahl hängt davon ab, ob die Anwendung über Anweisungen verfügt, die ausgeführt werden können, während der Vorgang abgeschlossen wird. Wenn eine Anwendung keine zusätzlichen Aufgaben erledigen kann, bis sie die Ergebnisse des asynchronen Vorgangs erhält, muss die Anwendung blockiert werden, bis die Ergebnisse verfügbar sind. Sie können einen der folgenden Ansätze zum Blockieren verwenden, bis der asynchrone Vorgang abgeschlossen ist:
Rufen Sie
EndOperationName
im Hauptthread der Anwendung auf, wodurch die Ausführung der Anwendung blockiert wird, bis der Vorgang abgeschlossen ist. Ein Beispiel zur Veranschaulichung dieses Verfahrens finden Sie unter Blockieren der Anwendungsausführung durch Beenden eines asynchronen Vorgangs.Verwenden Sie den AsyncWaitHandle zum Blockieren der Ausführung der Anwendung, bis mindestens ein Vorgang abgeschlossen ist. Ein Beispiel zur Veranschaulichung dieses Verfahrens finden Sie unter Blockieren der Anwendungsausführung mithilfe von AsyncWaitHandle.
Anwendungen, die nicht blockiert werden müssen, während der asynchrone Vorgang abgeschlossen wird, können einen der folgenden Ansätze verwenden:
Fragen Sie den Abschlussstatus des Vorgangs durch Überprüfen der IsCompleted-Eigenschaft in regelmäßigen Abständen ab, und rufen Sie
EndOperationName
auf, wenn der Vorgang abgeschlossen ist. Ein Beispiel zur Veranschaulichung dieses Verfahrens finden Sie unter Abrufen des Status einer asynchronen Operation.Verwenden Sie einen AsyncCallback -Delegat, um eine Methode aufzurufen, wenn der Vorgang abgeschlossen ist. Ein Beispiel zur Veranschaulichung dieses Verfahrens finden Sie unter Verwenden eines AsyncCallback-Delegaten zum Beenden einer asynchronen Operation.