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:

Anwendungen, die nicht blockiert werden müssen, während der asynchrone Vorgang abgeschlossen wird, können einen der folgenden Ansätze verwenden:

Siehe auch