Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 BeginOperationName
kann 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:
Rufen Sie
EndOperationName
vom Hauptthread der Anwendung aus auf, und blockieren Sie die Anwendungsausführung, bis der Vorgang abgeschlossen ist. Ein Beispiel, das diese Technik veranschaulicht, finden Sie unter Blockieren der Anwendungsausführung durch Beenden eines Asynchronen Vorgangs.Verwenden Sie AsyncWaitHandle, um die Ausführung der Anwendung zu blockieren, bis ein oder mehrere Vorgänge abgeschlossen sind. Ein Beispiel, das diese Technik veranschaulicht, finden Sie unter Blockieren der Anwendungsausführung mit AsyncWaitHandle.
Anwendungen, die nicht blockiert werden müssen, während der asynchrone Vorgang abgeschlossen ist, können einen der folgenden Ansätze verwenden:
Rufen Sie den Abschlussstatus des Vorgangs ab, indem Sie die IsCompleted-Eigenschaft regelmäßig überprüfen und
EndOperationName
aufrufen, wenn der Vorgang abgeschlossen ist. Ein Beispiel, das diese Technik veranschaulicht, finden Sie unter "Abrufen des Status eines asynchronen Vorgangs".Verwenden Sie einen AsyncCallback Delegaten, um eine Methode anzugeben, die aufgerufen werden soll, wenn der Vorgang abgeschlossen ist. Ein Beispiel, das diese Technik veranschaulicht, finden Sie unter Verwenden eines AsyncCallback-Delegaten zum Beenden eines asynchronen Vorgangs.