Synchrone und asynchrone VorgängeSynchronous and Asynchronous Operations

In diesem Thema werden das Implementieren und das Aufrufen asynchroner Dienstvorgänge erörtert.This topic discusses implementing and calling asynchronous service operations.

Viele Anwendungen rufen Methoden asynchron auf, weil dadurch die Anwendung beim Methodenaufruf weiter nützliche Arbeiten ausführen kann.Many applications call methods asynchronously because it enables the application to continue doing useful work while the method call runs. Windows Communication Foundation (WCF)-Dienste und Clients können an Aufrufen asynchroner Vorgänge auf zwei unterschiedliche Ebenen von der Anwendung teilnehmen die WCF-Anwendungen noch mehr Flexibilität Durchsatz unter Abwägung der Interaktivität zu maximieren ermöglichen .Windows Communication Foundation (WCF) services and clients can participate in asynchronous operation calls at two distinct levels of the application, which provide WCF applications even more flexibility to maximize throughput balanced against interactivity.

Typen asynchroner VorgängeTypes of Asynchronous Operations

Alle in WCF-Verträge, unabhängig davon, welche Parameter und Rückgabewerte, WCF-Attribute verwenden, um das Muster für einen bestimmten Nachrichtenaustausch zwischen Client und Dienst angeben.All service contracts in WCF, no matter the parameters types and return values, use WCF attributes to specify a particular message exchange pattern between client and service. WCF leitet automatisch eingehende und ausgehende Nachrichten an den entsprechenden Dienstvorgang oder ausgeführten Clientcode weiter.WCF automatically routes inbound and outbound messages to the appropriate service operation or running client code.

Der Client verfügt nur über den Dienstvertrag, der das Nachrichtenaustauschmuster für einen bestimmten Vorgang angibt.The client possesses only the service contract, which specifies the message exchange pattern for a particular operation. Clients können dem Entwickler ein beliebiges Programmiermodell anbieten, solange das zugrunde liegende Nachrichtenaustauschmuster eingehalten wird.Clients can offer the developer any programming model they choose, so long as the underlying message exchange pattern is observed. Ebenso können Dienste Vorgänge auf beliebige Weise implementieren, solange das angegebene Nachrichtenmuster eingehalten wird.So, too, can services implement operations in any manner, so long as the specified message pattern is observed.

Die Unabhängigkeit des Dienstvertrags von der Dienst- oder Client-Implementierung kann die folgenden Formen asynchroner Ausführung in WCF-Anwendungen:The independence of the service contract from either the service or client implementation enables the following forms of asynchronous execution in WCF applications:

  • Clients können Anforderungs-/Antwortvorgänge mit einem synchronen Nachrichtenaustausch asynchron aufrufen.Clients can invoke request/response operations asynchronously using a synchronous message exchange.

  • Clients können asynchrone Anforderungs-/Antwortvorgänge mit einem synchronen Nachrichtenaustausch implementieren.Services can implement a request/response operation asynchronously using a synchronous message exchange.

  • Ein Nachrichtenaustausch kann unidirektional sein, unabhängig von der Implementierung des Clients oder Dienstes.Message exchanges can be one-way, regardless of the implementation of the client or service.

Vorgeschlagene asynchrone SzenarienSuggested Asynchronous Scenarios

Verwenden Sie den asynchronen Ansatz in der Implementierung eines Dienstvorgangs, wenn dieser Dienstvorgang blockierende Aufrufe, beispielsweise E/A-Vorgänge, vornimmt.Use an asynchronous approach in a service operation implementation if the operation service implementation makes a blocking call, such as doing I/O work. Bei der Implementierung eines asynchronen Vorgangs sollten Sie versuchen, asynchrone Vorgänge und Methoden aufzurufen, um den asynchronen Aufrufpfad so weit wie möglich zu erweitern.When you are in an asynchronous operation implementation, try to call asynchronous operations and methods to extend the asynchronous call path as far as possible. Rufen Sie z. B. innerhalb von BeginOperationTwo() BeginOperationOne() auf.For example, call a BeginOperationTwo() from within BeginOperationOne().

  • Verwenden Sie in den folgenden Fällen einen asynchronen Ansatz in einem Client oder in einer aufrufenden Anwendung:Use an asynchronous approach in a client or calling application in the following cases:

  • Wenn Sie Vorgänge von einer Anwendung der mittleren Ebene aufrufen.If you are invoking operations from a middle-tier application. (Weitere Informationen zu solchen Szenarien finden Sie unter Clientanwendungen mittlerer Ebene.)(For more information about such scenarios, see Middle-Tier Client Applications.)

  • Verwenden Sie asynchrone Seiten, wenn Sie Vorgänge innerhalb einer ASP.NET-Seite aufrufen.If you are invoking operations within an ASP.NET page, use asynchronous pages.

  • Wenn Sie Vorgänge aus einer beliebigen Anwendung aufrufen, die Singlethread, z. B. Windows Forms oder Windows Presentation Foundation (WPF).If you are invoking operations from any application that is single threaded, such as Windows Forms or Windows Presentation Foundation (WPF). Bei Verwendung des ereignisgesteuerten asynchronen Aufrufmodells wird das resultierende Ereignis im UI-Thread ausgelöst. Dies erhöht die Ansprechempfindlichkeit der Anwendung gegenüber Benutzeraktivitäten, ohne dass Sie selbst mehrere Threads verwalten müssen.When using the event-based asynchronous calling model, the result event is raised on the UI thread, adding responsiveness to the application without requiring you to handle multiple threads yourself.

  • Im Allgemeinen gilt: Haben Sie die Wahl zwischen einem synchronen oder einem asynchronen Aufruf, dann wählen Sie den asynchronen Aufruf.In general, if you have a choice between a synchronous and asynchronous call, choose the asynchronous call.

Implementieren eines asynchronen DienstvorgangsImplementing an Asynchronous Service Operation

Asynchrone Vorgänge können auf eine der drei folgenden Arten implementiert werden:Asynchronous operations can be implemented by using one of the three following methods:

  1. Das taskbasierte asynchrone MusterThe task-based asynchronous pattern

  2. Das ereignisbasierte asynchrone MusterThe event-based asynchronous pattern

  3. Das asynchrone IAsyncResult-MusterThe IAsyncResult asynchronous pattern

Taskbasiertes asynchrones MusterTask-Based Asynchronous Pattern

Das aufgabenbasierte asynchrone Muster ist die bevorzugte Methode zum Implementieren asynchroner Vorgänge, weil es einfach und verständlich ist.The task-based asynchronous pattern is the preferred way to implement asynchronous operations because it is the easiest and most straight forward. Mit dieser Methode einfach den Dienstvorgang implementieren, und geben Sie den Rückgabetyp Task<T >, wobei T der Typ, der von der logischen Operation zurückgegeben.To use this method simply implement your service operation and specify a return type of Task<T>, where T is the type returned by the logical operation. Zum Beispiel:For example:

public class SampleService:ISampleService   
{   
   // ...  
   public async Task<string> SampleMethodTaskAsync(string msg)   
   {   
      return Task<string>.Factory.StartNew(() =>   
      {   
         return msg;   
      });   
   }  
   // ...  
}  

Der SampleMethodTaskAsync-Vorgang gibt Task<Zeichenfolge > da die logische Operation eine Zeichenfolge zurückgibt.The SampleMethodTaskAsync operation returns Task<string> because the logical operation returns a string. Weitere Informationen über das aufgabenbasierte asynchrone Muster finden Sie unter taskbasiertes asynchrones Muster.For more information about the task-based asynchronous pattern, see The Task-Based Asynchronous Pattern.

Warnung

Bei Verwendung des taskbasierten asynchronen Musters kann bei einer Ausnahme eine T:System.AggregateException ausgelöst werden, während auf den Abschluss des Vorgangs gewartet wird.When using the task-based asynchronous pattern, a T:System.AggregateException may be thrown if an exception occurs while waiting on the completion of the operation. Diese Ausnahme kann für Clients oder Dienste auftreten.This exception may occur on the client or services

Ereignisbasiertes asynchrones MusterEvent-Based Asynchronous Pattern

Ein Dienst, der das ereignisbasierte asynchrone Muster unterstützt, verfügt über einen oder mehrere Vorgänge mit dem Namen MethodNameAsync.A service that supports the Event-based Asynchronous Pattern will have one or more operations named MethodNameAsync. Diese Methoden spiegeln möglicherweise synchrone Versionen wider, die denselben Vorgang im aktuellen Thread durchführen.These methods may mirror synchronous versions, which perform the same operation on the current thread. Die Klasse kann darüber hinaus auch über ein MethodNameCompleted-Ereignis und eine MethodNameAsyncCancel-Methode (kurz CancelAsync) verfügen.The class may also have a MethodNameCompleted event and it may have a MethodNameAsyncCancel (or simply CancelAsync) method. Ein Client, der den Vorgang aufrufen möchte, definiert einen Ereignishandler, der bei Abschluss des Vorgangs aufgerufen wird.A client wishing to call the operation will define an event handler to be called when the operation completes,

Der folgende Codeausschnitt veranschaulicht, wie asynchrone Vorgänge unter Verwendung des ereignisbasierten asynchronen Musters deklariert werden.The following code snippet illustrates how to declare asynchronous operations using the event-based asynchronous pattern.

public class AsyncExample  
{  
    // Synchronous methods.  
    public int Method1(string param);  
    public void Method2(double param);  

    // Asynchronous methods.  
    public void Method1Async(string param);  
    public void Method1Async(string param, object userState);  
    public event Method1CompletedEventHandler Method1Completed;  

    public void Method2Async(double param);  
    public void Method2Async(double param, object userState);  
    public event Method2CompletedEventHandler Method2Completed;  

    public void CancelAsync(object userState);  

    public bool IsBusy { get; }  

    // Class implementation not shown.  
}  

Weitere Informationen über das ereignisbasierte asynchrone Muster finden Sie unter ereignisbasiertes asynchrones Muster.For more information about the Event-based Asynchronous Pattern, see The Event-Based Asynchronous Pattern.

Das asynchrone IAsyncResult-MusterIAsyncResult Asynchronous Pattern

Ein Dienstvorgang kann asynchron mit dem asynchronen .NET Framework.NET Framework-Programmierungsmuster implementiert werden, wobei die <Begin>-Methode mit der auf AsyncPattern festgelegten true-Eigenschaft markiert wird.A service operation can be implemented in an asynchronous fashion using the .NET Framework.NET Framework asynchronous programming pattern and marking the <Begin> method with the AsyncPattern property set to true. In diesem Fall wird der asynchrone Vorgang in Metadaten in der gleichen Form wie ein synchroner Vorgang verfügbar gemacht: Er wird als einzelner Vorgang mit einer Anforderungsnachricht und einer korrelierten Antwortnachricht verfügbar gemacht.In this case, the asynchronous operation is exposed in metadata in the same form as a synchronous operation: It is exposed as a single operation with a request message and a correlated response message. Clientprogrammierungsmodelle haben dann eine Wahl.Client programming models then have a choice. Sie können dieses Muster als synchronen oder als asynchronen Vorgang darstellen, solange beim Aufrufen des Diensts ein Anforderung-Antwort-Nachrichtenaustausch stattfindet.They can represent this pattern as a synchronous operation or as an asynchronous one, so long as when the service is invoked a request-response message exchange takes place.

Aufgrund der asynchronen Natur der Systeme sollte i. A. eine Abhängigkeit von den Threads vermieden werden.In general, with the asynchronous nature of the systems, you should not take a dependency on the threads. Die verlässlichste Möglichkeit, Daten an verschiedene Stufen der Vorgangsverteilungsverarbeitung zu übergeben, ist die Verwendung von Erweiterungen.The most reliable way of passing data to various stages of operation dispatch processing is to use extensions.

Ein Beispiel finden Sie unter Vorgehensweise: Implementieren eines asynchronen Dienstvorgangs.For an example, see How to: Implement an Asynchronous Service Operation.

So definieren Sie ein Vertragsvorgang X, der unabhängig von der Art des Aufrufs in der Clientanwendung asynchron ausgeführt wird:To define a contract operation X that is executed asynchronously regardless of how it is called in the client application:

  • Definieren Sie zwei Methoden mit dem Muster BeginOperation und EndOperation.Define two methods using the pattern BeginOperation and EndOperation.

  • Die BeginOperation-Methode enthält den in-Parameter und den ref-Parameter für den Vorgang und gibt einen IAsyncResult-Typ zurück.The BeginOperation method includes in and ref parameters for the operation and returns an IAsyncResult type.

  • Die EndOperation-Methode enthält ebenfalls einen IAsyncResult-Parameter sowie den out-Parameter und den ref-Parameter und gibt den Rückgabewert des Vorgangs zurück.The EndOperation method includes an IAsyncResult parameter as well as the out and ref parameters and returns the operations return type.

Betrachten Sie beispielsweise die folgende Methode:For example, see the following method.

int DoWork(string data, ref string inout, out string outonly)  
Function DoWork(ByVal data As String, ByRef inout As String, _out outonly As out) As Integer  

Die beiden Methoden zum Erstellen eines asynchronen Vorgangs sind:To create an asynchronous operation, the two methods would be:

[OperationContract(AsyncPattern=true)]IAsyncResult BeginDoWork(string data,                           ref string inout,                           AsyncCallback callback,                           object state);int EndDoWork(ref string inout, out string outonly, IAsyncResult result);  
<OperationContract(AsyncPattern := True)>  _Function BeginDoWork(ByVal data As String, _                 ByRef inout As String, _                 ByVal callback As AsyncCallback, _                 ByVal state As Object) _As IAsyncResult Function EndDoWork(ByRef inout As String, _        ByRef outonly As String, _        ByVal result As IAsyncResult) _As Integer  

Hinweis

Das OperationContractAttribute-Attribut wird nur auf die BeginDoWork-Methode angewendet.The OperationContractAttribute attribute is applied only to the BeginDoWork method. Der resultierende Vertrag verfügt über einen WSDL-Vorgang mit der Bezeichnung DoWork.The resulting contract has one WSDL operation named DoWork.

Clientseitige asynchrone AufrufeClient-Side Asynchronous Invocations

Eine WCF-Clientanwendung kann eine der drei asynchronen Aufrufen von Modellen, die zuvor beschriebenen verwenden.A WCF client application can use any of three asynchronous calling models described previously

Wenn Sie das aufgabenbasierte Modell verwenden, rufen Sie einfach den Vorgang mithilfe des await-Schlüsselworts wie im folgenden Codeausschnitt dargestellt auf.When using the task-based model, simply call the operation using the await keyword as shown in the following code snippet.

await simpleServiceClient.SampleMethodTaskAsync("hello, world");  

Das ereignisbasierte asynchrone Muster erfordert lediglich, dass ein Ereignishandler hinzugefügt wird, der eine Benachrichtigung über die Antwort empfängt – und das Ereignis wird automatisch im Benutzeroberflächenthread ausgelöst.Using the event-based asynchronous pattern only requires adding an event handler to receive a notification of the response -- and the resulting event is raised on the user interface thread automatically. Um diesen Ansatz verwenden, geben Sie sowohl die /async und /tcv:Version35 Befehlsoptionen, mit der ServiceModel Metadata Utility Tool (Svcutil.exe), wie im folgenden Beispiel:.To use this approach, specify both the /async and /tcv:Version35 command options with the ServiceModel Metadata Utility Tool (Svcutil.exe), as in the following example.

svcutil http://localhost:8000/servicemodelsamples/service/mex /async /tcv:Version35  

Nachdem dies geschehen ist, generiert Svcutil.exe eine WCF-Clientklasse mit der Ereignisinfrastruktur, mit denen die aufrufende Anwendung implementieren, und weisen einen Ereignishandler zum Empfangen der Antwort und die entsprechende Aktion aus.When this is done, Svcutil.exe generates a WCF client class with the event infrastructure that enables the calling application to implement and assign an event handler to receive the response and take the appropriate action. Ein vollständiges Beispiel finden Sie unter Vorgehensweise: Aufrufen Service Vorgänge asynchron.For a complete example, see How to: Call Service Operations Asynchronously.

Das ereignisbasierte asynchrone Modell ist jedoch nur in .NET Framework Version 3.5.NET Framework version 3.5 verfügbar.The event-based asynchronous model, however, is only available in .NET Framework Version 3.5.NET Framework version 3.5. Darüber hinaus wird nicht unterstützt auch im .NET Framework 3,5.NET Framework 3.5 Erstellung ein WCF-Clientkanal mithilfe einer System.ServiceModel.ChannelFactory<TChannel>.In addition, it is not supported even in .NET Framework 3,5.NET Framework 3.5 when a WCF client channel is created by using a System.ServiceModel.ChannelFactory<TChannel>. Mit WCF-Kanal-Clientobjekte, verwenden Sie System.IAsyncResult -Objekten, die Vorgänge asynchron aufzurufen.With WCF client channel objects, you must use System.IAsyncResult objects to invoke your operations asynchronously. Um diesen Ansatz verwenden, geben Sie die /async Befehlsoption mit der ServiceModel Metadata Utility Tool (Svcutil.exe), wie im folgenden Beispiel.To use this approach, specify the /async command option with the ServiceModel Metadata Utility Tool (Svcutil.exe), as in the following example.

svcutil http://localhost:8000/servicemodelsamples/service/mex /async   

Dadurch wird ein Dienstvertrag generiert, in dem jeder Vorgang als eine <Begin>-Methode mit der auf AsyncPattern festgelegten true-Eigenschaft und einer entsprechenden <End>-Methode modelliert wird.This generates a service contract in which each operation is modeled as a <Begin> method with the AsyncPattern property set to true and a corresponding <End> method. Für ein vollständiges Beispiel mit einer ChannelFactory<TChannel>, finden Sie unter Vorgehensweise: Aufrufen mithilfe Vorgänge asynchron eine Kanalfactory.For a complete example using a ChannelFactory<TChannel>, see How to: Call Operations Asynchronously Using a Channel Factory.

In jedem Fall können Anwendungen einen Vorgang asynchron aufrufen, auch wenn der Dienst synchron implementiert wurde, ebenso wie eine Anwendung mit dem gleichen Muster eine lokale synchrone Methode asynchron aufrufen kann.In either case, applications can invoke an operation asynchronously even if the service is implemented synchronously, in the same way that an application can use the same pattern to invoke asynchronously a local synchronous method. Wie der Vorgang implementiert wird, ist für den Client nicht von Bedeutung; wenn die Antwortnachricht eintrifft, wird ihr Inhalt an die asynchrone <End>-Methode des Clients gesendet, und der Client ruft die Informationen ab.How the operation is implemented is not significant to the client; when the response message arrives, its content is dispatched to the client's asynchronous <End> method and the client retrieves the information.

Unidirektionale NachrichtenaustauschmusterOne-Way Message Exchange Patterns

Sie können auch ein asynchrones Nachrichtenaustauschmuster erstellen, in dem unidirektionale Vorgänge (Vorgänge, bei denen das OperationContractAttribute.IsOneWay true ist, verfügen über keine korrelierte Antwort) vom Client oder vom Dienst unabhängig von der anderen Seite in beide Richtungen gesendet werden können.You can also create an asynchronous message exchange pattern in which one-way operations (operations for which the OperationContractAttribute.IsOneWay is true have no correlated response) can be sent in either direction by the client or service independently of the other side. (Dabei wird das Duplex-Nachrichtenaustauschmuster mit unidirektionalen Nachrichten verwendet.) In diesem Fall gibt der Dienstvertrag einen unidirektionalen Nachrichtenaustausch an, den eine der beiden Seiten ggf. als asynchrone Aufrufe oder Implementierungen oder nicht implementieren kann.(This uses the duplex message exchange pattern with one-way messages.) In this case, the service contract specifies a one-way message exchange that either side can implement as asynchronous calls or implementations, or not, as appropriate. Wenn der Vertrag ein Austausch von unidirektionalen Nachrichten ist, können die Implementierungen im Allgemeinen hauptsächlich asynchron sein, da die Anwendung nach dem Senden der Nachricht nicht auf eine Antwort wartet und andere Aktivitäten weiter ausführen kann.Generally, when the contract is an exchange of one-way messages, the implementations can largely be asynchronous because once a message is sent the application does not wait for a reply and can continue doing other work.

Ereignisbasierte asynchrone Clients und NachrichtenverträgeEvent-based Asynchronous Clients and Message Contracts

Die Entwurfsrichtlinien für das ereignisbasierte asynchrone Modell besagen, dass in den Fällen, in denen mehr als ein Wert zurückgegeben wird, ein Wert in der Result-Eigenschaft und die übrigen Werte in Eigenschaften des EventArgs-Objekts zurückgegeben werden sollen.The design guidelines for the event-based asynchronous model state that if more than one value is returned, one value is returned as the Result property and the others are returned as properties on the EventArgs object. Wenn ein Client Metadaten mithilfe der ereignisbasierten asynchronen Befehlsoptionen importiert, und der Vorgang mehr als einen Wert zurückgibt, dann gibt das EventArgs-Standardobjekt infolgedessen einen Wert in der Result-Eigenschaft zurück, während die übrigen Werte in Eigenschaften des EventArgs-Objekts zurückgegeben werden.One result of this is that if a client imports metadata using the event-based asynchronous command options and the operation returns more than one value, the default EventArgs object returns one value as the Result property and the remainder are properties of the EventArgs object.

Wenn das Nachrichtenobjekt erhalten sollen die Result Eigenschaft und die zurückgegebenen Werte aufweisen, wie Eigenschaften für dieses Objekt verwenden, die /messageContract -Befehlsoption verwenden.If you want to receive the message object as the Result property and have the returned values as properties on that object, use the /messageContract command option. Damit wird eine Signatur generiert, bei der die Antwortnachricht in der Result-Eigenschaft des EventArgs-Objekts zurückgegeben wird.This generates a signature that returns the response message as the Result property on the EventArgs object. Alle internen Rückgabewerte sind dann Eigenschaften des Antwortnachrichtenobjekts.All internal return values are then properties of the response message object.

Siehe auchSee Also

IsOneWay
AsyncPattern