Asynchrones Programmiermodell (APM)Asynchronous Programming Model (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.An asynchronous operation that uses the IAsyncResult design pattern is implemented as two methods named BeginOperationName and EndOperationName that begin and end the asynchronous operation OperationName respectively. Die FileStream -Klasse stellt z. B. die Methoden BeginRead und EndRead zum asynchronen Lesen von Bytes aus einer Datei bereit.For example, the FileStream class provides the BeginRead and EndRead methods to asynchronously read bytes from a file. Diese Methoden implementieren die asynchrone Version der Read -Methode.These methods implement the asynchronous version of the Read method.

Hinweis

Ab .NET Framework 4 stellt die Task Parallel Library ein neues Modell für die asynchrone und parallele Programmierung bereit.Starting with the .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. Weitere Informationen finden Sie unter Task Parallel Library (TPL) und Task-based Asynchronous Pattern (TAP).For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

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.After calling BeginOperationName, an application can continue executing instructions on the calling thread while the asynchronous operation takes place on a different thread. Für jeden Aufruf von BeginOperationName sollte die Anwendung auch EndOperationName aufrufen, um die Ergebnisse des Vorgangs abzurufen.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation.

Starten eines asynchronen VorgangsBeginning an Asynchronous Operation

Die Methode BeginOperationName startet den asynchronen Vorgang OperationName und gibt ein Objekt zurück, das die IAsyncResult-Schnittstelle implementiert.The BeginOperationName method begins asynchronous operation OperationName and returns an object that implements the IAsyncResult interface. IAsyncResult -Objekte speichern Informationen zu einem asynchronen Vorgang.IAsyncResult objects store information about an asynchronous operation. In der folgenden Tabelle werden Informationen zu einem asynchronen Vorgang angezeigt.The following table shows information about an asynchronous operation.

MemberMember BeschreibungDescription
AsyncState Ein optionales, anwendungsspezifisches Objekt, das Informationen über die asynchrone Operation enthält.An optional application-specific object that contains information about the asynchronous operation.
AsyncWaitHandle Ein WaitHandle , mit dem die Ausführung der Anwendung blockiert werden kann, bis der asynchrone Vorgang abgeschlossen ist.A WaitHandle that can be used to block application execution until the asynchronous operation completes.
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.A value that indicates whether the asynchronous operation completed on the thread used to call BeginOperationName instead of completing on a separate ThreadPool thread.
IsCompleted Ein Wert, der angibt, ob der asynchrone Vorgang abgeschlossen wurde.A value that indicates whether the asynchronous operation has completed.

Eine BeginOperationName-Methode übernimmt jeden in der Signatur der synchronen Version der Methode deklarierten Parameter, der als Wert oder Verweis übergeben wird.A BeginOperationName method takes any parameters declared in the signature of the synchronous version of the method that are passed by value or by reference. out-Parameter sind nicht Teil der BeginOperationName-Methodensignatur.Any out parameters are not part of the BeginOperationName method signature. Die BeginOperationName-Methodensignatur umfasst auch zwei weitere Parameter.The BeginOperationName method signature also includes two additional parameters. Der erste dieser Parameter definiert einen AsyncCallback -Delegat, der auf eine Methode verweist, die bei Beendigung des asynchronen Aufrufs aufgerufen wird.The first of these defines an AsyncCallback delegate that references a method that is called when the asynchronous operation completes. Der Aufrufer kann null angeben (Nothing in Visual Basic), wenn nach Abschluss des Vorgangs keine Methode aufgerufen werden soll.The caller can specify null (Nothing in Visual Basic) if it does not want a method invoked when the operation completes. Der zweite zusätzliche Parameter ist ein benutzerdefiniertes Objekt.The second additional parameter is a user-defined object. Dieses Objekt kann verwendet werden, um anwendungsspezifische Informationen an die Methode zu übergeben, die aufgerufen wird, wenn der asynchrone Vorgang abgeschlossen ist.This object can be used to pass application-specific state information to the method invoked when the asynchronous operation completes. 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.If a BeginOperationName method takes additional operation-specific parameters, such as a byte array to store bytes read from a file, the AsyncCallback and application state object are the last parameters in the BeginOperationName method signature.

BeginOperationName gibt die Kontrolle sofort an den aufrufenden Thread zurück.BeginOperationName returns control to the calling thread immediately. Wenn die BeginOperationName-Methode Ausnahmen auslöst, erfolgt die Auslösung, bevor der asynchrone Vorgang gestartet wird.If the BeginOperationName method throws exceptions, the exceptions are thrown before the asynchronous operation is started. Wenn die BeginOperationName-Methode Ausnahmen auslöst, wird die Rückrufmethode nicht aufgerufen.If the BeginOperationName method throws exceptions, the callback method is not invoked.

Beenden eines asynchronen VorgangsEnding an Asynchronous Operation

Die EndOperationName-Methode beendet den asynchronen Vorgang OperationName.The EndOperationName method ends asynchronous operation 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.The return value of the EndOperationName method is the same type returned by its synchronous counterpart and is specific to the asynchronous operation. 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.For example, the EndRead method returns the number of bytes read from a FileStream and the EndGetHostByName method returns an IPHostEntry object that contains information about a host computer. Die EndOperationName-Methode übernimmt jeden in der Signatur der synchronen Version der Methode deklarierten out- oder ref-Parameter.The EndOperationName method takes any out or ref parameters declared in the signature of the synchronous version of the method. Zusätzlich zu den Parametern der synchronen Methode umfasst die EndOperationName-Methode auch einen IAsyncResult-Parameter.In addition to the parameters from the synchronous method, the EndOperationName method also includes an IAsyncResult parameter. Aufrufer müssen die vom entsprechenden Aufruf zurückgegebene Instanz an BeginOperationName übergeben.Callers must pass the instance returned by the corresponding call to BeginOperationName.

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.If the asynchronous operation represented by the IAsyncResult object has not completed when EndOperationName is called, EndOperationName blocks the calling thread until the asynchronous operation is complete. Vom asynchronen Vorgang ausgelöste Ausnahmen werden von der EndOperationName-Methode ausgelöst.Exceptions thrown by the asynchronous operation are thrown from the EndOperationName method. Die Auswirkung eines mehrmaligen Aufrufs der EndOperationName-Methode mit demselben IAsyncResult ist nicht definiert.The effect of calling the EndOperationName method multiple times with the same IAsyncResult is not defined. Der Aufruf der EndOperationName-Methode mit einem IAsyncResult, das nicht von der zugehörigen Begin-Methode zurückgegeben wurde, ist ebenfalls nicht definiert.Likewise, calling the EndOperationName method with an IAsyncResult that was not returned by the related Begin method is also not defined.

Hinweis

Für beide nicht definierten Szenarien sollten die für die Implementierung zuständigen Personen das Auslösen von InvalidOperationExceptionerwägen.For either of the undefined scenarios, implementers should consider throwing InvalidOperationException.

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.Implementers of this design pattern should notify the caller that the asynchronous operation completed by setting IsCompleted to true, calling the asynchronous callback method (if one was specified) and signaling the AsyncWaitHandle.

Anwendungsentwickler verfügen über mehrere Entwurfsoptionen für den Zugriff auf die Ergebnisse des asynchronen Vorgangs.Application developers have several design choices for accessing the results of the asynchronous operation. 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.The correct choice depends on whether the application has instructions that can execute while the operation completes. 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.If an application cannot perform any additional work until it receives the results of the asynchronous operation, the application must block until the results are available. Sie können einen der folgenden Ansätze zum Blockieren verwenden, bis der asynchrone Vorgang abgeschlossen ist:To block until an asynchronous operation completes, you can use one of the following approaches:

Anwendungen, die nicht blockiert werden müssen, während der asynchrone Vorgang abgeschlossen wird, können einen der folgenden Ansätze verwenden:Applications that do not need to block while the asynchronous operation completes can use one of the following approaches:

Siehe auchSee also