Freigeben über


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. Beispielsweise stellt die FileStream Klasse die BeginRead und EndRead Methoden zum asynchronen Lesen von Bytes aus einer Datei bereit. Diese Methoden implementieren die asynchrone Version der Read Methode.

Hinweis

Ab .NET Framework 4 bietet die Task Parallel Library ein neues Modell für die asynchrone und parallele Programmierung. Weitere Informationen finden Sie unter Task Parallel Library (TPL) und aufgabenbasiertes asynchrones Muster (TAP).For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

Nach dem Aufrufen BeginOperationNamekann eine Anwendung die Ausführung von Anweisungen im 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 BeginOperationName Methode beginnt mit dem asynchronen Vorgang "OperationName " und gibt ein Objekt zurück, das die IAsyncResult Schnittstelle implementiert. IAsyncResult Objekte speichern Informationen zu einem asynchronen Vorgang. Die folgende Tabelle enthält Informationen zu einem asynchronen Vorgang.

Mitglied BESCHREIBUNG
AsyncState Ein optionales anwendungsspezifisches Objekt, das Informationen zum asynchronen Vorgang enthält.
AsyncWaitHandle Eine WaitHandle , die zum Blockieren der Anwendungsausführung verwendet 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 verwendet alle in der Signatur der synchronen Version der Methode angegebenen Parameter, die entweder nach Wert oder als Referenz übergeben werden. Alle Ausgabeparameter sind nicht Teil der BeginOperationName Methodensignatur. Die BeginOperationName Methodensignatur enthält auch zwei zusätzliche Parameter. Der erste dieser Elemente definiert einen AsyncCallback Delegaten, der auf eine Methode verweist, die aufgerufen wird, wenn der asynchrone Vorgang abgeschlossen ist. Der Aufrufer kann null angeben (Nothing in Visual Basic), wenn er nicht möchte, dass eine Methode aufgerufen wird, wenn der Vorgang abgeschlossen ist. Der zweite zusätzliche Parameter ist ein benutzerdefiniertes Objekt. Dieses Objekt kann verwendet werden, um anwendungsspezifische Statusinformationen an die Methode zu übergeben, die aufgerufen wird, wenn der asynchrone Vorgang abgeschlossen ist. Wenn eine BeginOperationName Methode zusätzliche vorgangsspezifische Parameter verwendet, z. B. ein Bytearray zum Speichern von Bytes, die aus einer Datei gelesen werden, sind das Objekt und das AsyncCallback Anwendungsstatusobjekt die letzten Parameter in der BeginOperationName Methodensignatur.

BeginOperationName gibt die Steuerung sofort an den aufrufenden Thread zurück. Wenn die BeginOperationName Methode Ausnahmen auslöst, werden die Ausnahmen ausgelöst, 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 ist derselbe Typ, der von seinem synchronen Gegenstück zurückgegeben wird und für den asynchronen Vorgang spezifisch ist. Die EndRead Methode gibt beispielsweise die Anzahl der von einem FileStream gelesenen Bytes zurück, und die EndGetHostByName Methode gibt ein IPHostEntry Objekt zurück, das Informationen zu einem Hostcomputer enthält. Die EndOperationName Methode akzeptiert alle Ausgaben- oder Referenzparameter, die in der Signatur der synchronen Version der Methode deklariert sind. Zusätzlich zu den Parametern aus der synchronen Methode enthält 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 wurde, wenn EndOperationName aufgerufen wird, wird der aufrufende Thread durch EndOperationName blockiert, bis der asynchrone Vorgang abgeschlossen ist. Ausnahmen, die vom asynchronen Vorgang ausgelöst werden, werden von der EndOperationName Methode ausgelöst. Der Effekt des mehrfachen Aufrufens 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 eines der nicht definierten Szenarien sollten Implementierer das Auslösen von InvalidOperationException in Erwägung ziehen.

Hinweis

Implementierer dieses Entwurfsmusters sollten den Aufrufer benachrichtigen, dass der asynchrone Vorgang abgeschlossen wurde, indem IsCompleted auf "true" gesetzt wird, die asynchrone Rückrufmethode aufgerufen wird (sofern angegeben) und AsyncWaitHandle signalisiert wird.

Anwendungsentwickler haben mehrere Entwurfsoptionen für den Zugriff auf die Ergebnisse des asynchronen Vorgangs. Die richtige Auswahl hängt davon ab, ob die Anwendung Anweisungen enthält, die ausgeführt werden können, während der Vorgang abgeschlossen ist. Wenn eine Anwendung keine zusätzliche Arbeit ausführen kann, bis sie die Ergebnisse des asynchronen Vorgangs empfängt, muss die Anwendung blockieren, bis die Ergebnisse verfügbar sind. Um zu blockieren, bis ein asynchroner Vorgang abgeschlossen ist, können Sie einen der folgenden Ansätze verwenden:

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

Siehe auch