Vorgehensweise: Implementieren eines asynchronen DienstvorgangsHow to: Implement an Asynchronous Service Operation

In Windows Communication Foundation (WCF)-Anwendungen kann ein Dienstvorgang asynchron oder synchron implementiert werden ohne dem Client vorzuschreiben, wie er ihn aufzurufen.In Windows Communication Foundation (WCF) applications, a service operation can be implemented asynchronously or synchronously without dictating to the client how to call it. So können z. B. asynchrone Dienstvorgänge synchron aufrufen, und synchrone Dienstvorgänge können asynchron aufgerufen werden.For example, asynchronous service operations can be calling synchronously, and synchronous service operations can be called asynchronously. Ein Beispiel, das zeigt, wie einen Vorgang asynchron in einer Clientanwendung aufgerufen werden, finden Sie unter Vorgehensweise: Aufrufen Service Vorgänge asynchron.For an example that shows how to call an operation asynchronously in a client application, see How to: Call Service Operations Asynchronously. Weitere Informationen zu synchronen und asynchronen Vorgängen finden Sie unter Entwerfen von Dienstverträgen und synchrone und asynchrone Vorgänge.For more information about synchronous and asynchronous operations, see Designing Service Contracts and Synchronous and Asynchronous Operations. In diesem Thema wird die grundlegende Struktur eines asynchronen Dienstvorgangs beschrieben (der Code ist nicht vollständig).This topic describes the basic structure of an asynchronous service operation, the code is not complete. Ein vollständiges Beispiel sowohl im Dienst-als auch Seiten finden Sie unter asynchrone.For a complete example of both the service and client sides see Asynchronous.

Asynchrones Implementieren eines DienstvorgangsImplement a service operation asynchronously

  1. Deklarieren Sie im Dienstvertrag ein asynchrones Methodenpaar entsprechend den .NET-Richtlinien für den asynchronen Entwurf.In your service contract, declare an asynchronous method pair according to the .NET asynchronous design guidelines. Die Methode Begin nimmt einen Parameter, ein Rückrufobjekt und ein Statusobjekt und gibt eine System.IAsyncResult-Methode und eine entsprechende End-Methode aus, die ein System.IAsyncResult nimmt und den Rückgabewert ausgibt.The Begin method takes a parameter, a callback object, and a state object, and returns a System.IAsyncResult and a matching End method that takes a System.IAsyncResult and returns the return value. Weitere Informationen zu asynchronen Aufrufen, finden Sie unter Entwurfsmuster für asynchrone Programmierung.For more information about asynchronous calls, see Asynchronous Programming Design Patterns.

  2. Markieren Sie die Methode Begin des asynchronen Methodenpaars mit dem Attribut System.ServiceModel.OperationContractAttribute, und legen Sie die Eigenschaft OperationContractAttribute.AsyncPattern auf true fest.Mark the Begin method of the asynchronous method pair with the System.ServiceModel.OperationContractAttribute attribute and set the OperationContractAttribute.AsyncPattern property to true. Der folgende Code führt beispielsweise die Schritte 1 und 2 aus.For example, the following code performs steps 1 and 2.

      [OperationContractAttribute(AsyncPattern=true)]
      IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState);
    
      // Note: There is no OperationContractAttribute for the end method.
      string EndServiceAsyncMethod(IAsyncResult result);
    }
    
    <OperationContractAttribute(AsyncPattern:=True)> _
    Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult
    
    ' Note: There is no OperationContractAttribute for the end method.
    Function EndServiceAsyncMethod(ByVal result As IAsyncResult) As String
     End Interface
    
  3. Implementieren Sie das Methodenpaar Begin/End in Ihrer Dienstklasse gemäß den asynchronen Entwurfsrichtlinien von .NET.Implement the Begin/End method pair in your service class according to the asynchronous design guidelines. Das folgende Codebeispiel zeigt eine Implementierung, in der eine Zeichenkette sowohl in den Teilen Begin als auch End des asynchronen Dienstvorgangs auf die Konsole geschrieben ist, und der Rückgabewert des Vorgangs End wird an den Client ausgegeben.For example, the following code example shows an implementation in which a string is written to the console in both the Begin and End portions of the asynchronous service operation, and the return value of the End operation is returned to the client. Das vollständige Codebeispiel finden Sie im Abschnitt "Beispiel".For the complete code example, see the Example section.

    public IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState) 
    {
      Console.WriteLine("BeginServiceAsyncMethod called with: \"{0}\"", msg);
      return new CompletedAsyncResult<string>(msg);
    }
    
    public string EndServiceAsyncMethod(IAsyncResult r)
    {
      CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>;
      Console.WriteLine("EndServiceAsyncMethod called with: \"{0}\"", result.Data);
      return result.Data;
    }
    
    Public Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult Implements ISampleService.BeginServiceAsyncMethod
      Console.WriteLine("BeginServiceAsyncMethod called with: ""{0}""", msg)
      Return New CompletedAsyncResult(Of String)(msg)
    End Function
    
    Public Function EndServiceAsyncMethod(ByVal r As IAsyncResult) As String Implements ISampleService.EndServiceAsyncMethod
      Dim result As CompletedAsyncResult(Of String) = TryCast(r, CompletedAsyncResult(Of String))
      Console.WriteLine("EndServiceAsyncMethod called with: ""{0}""", result.Data)
      Return result.Data
    End Function
    

BeispielExample

Das folgende Codebeispiel zeigt:The following code examples show:

  1. Eine Dienstvertragschnittstelle mit:A service contract interface with:

    1. Einem synchronen SampleMethod-Vorgang.A synchronous SampleMethod operation.

    2. Einem asynchronen BeginSampleMethod-Vorgang.An asynchronous BeginSampleMethod operation.

    3. Eine asynchrone BeginServiceAsyncMethod / EndServiceAsyncMethod vorgangspaar.An asynchronous BeginServiceAsyncMethod/EndServiceAsyncMethod operation pair.

  2. Einer Dienstimplementierung mit einem System.IAsyncResult-Objekt.A service implementation using a System.IAsyncResult object.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContractAttribute(Namespace="http://microsoft.wcf.documentation")]
  public interface ISampleService{

    [OperationContractAttribute]
    string SampleMethod(string msg);

    [OperationContractAttribute(AsyncPattern = true)]
    IAsyncResult BeginSampleMethod(string msg, AsyncCallback callback, object asyncState);

    //Note: There is no OperationContractAttribute for the end method.
    string EndSampleMethod(IAsyncResult result);

    [OperationContractAttribute(AsyncPattern=true)]
    IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState);

    // Note: There is no OperationContractAttribute for the end method.
    string EndServiceAsyncMethod(IAsyncResult result);
  }

  public class SampleService : ISampleService
  {
    #region ISampleService Members

    public string  SampleMethod(string msg)
    {
      Console.WriteLine("Called synchronous sample method with \"{0}\"", msg);
 	    return "The sychronous service greets you: " + msg;
    }

    // This asynchronously implemented operation is never called because 
    // there is a synchronous version of the same method.
    public IAsyncResult BeginSampleMethod(string msg, AsyncCallback callback, object asyncState)
    {
      Console.WriteLine("BeginSampleMethod called with: " + msg);
      return new CompletedAsyncResult<string>(msg);
    }

    public string EndSampleMethod(IAsyncResult r)
    {
      CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>;
      Console.WriteLine("EndSampleMethod called with: " + result.Data);
      return result.Data;
    }

    public IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState) 
    {
      Console.WriteLine("BeginServiceAsyncMethod called with: \"{0}\"", msg);
      return new CompletedAsyncResult<string>(msg);
    }

    public string EndServiceAsyncMethod(IAsyncResult r)
    {
      CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>;
      Console.WriteLine("EndServiceAsyncMethod called with: \"{0}\"", result.Data);
      return result.Data;
    }
    #endregion
  }

  // Simple async result implementation.
  class CompletedAsyncResult<T> : IAsyncResult
  {
    T data;

    public CompletedAsyncResult(T data)
    { this.data = data; }

    public T Data
    { get { return data; } }

    #region IAsyncResult Members
    public object AsyncState
    { get { return (object)data; } }

    public WaitHandle AsyncWaitHandle
    { get { throw new Exception("The method or operation is not implemented."); } }

    public bool CompletedSynchronously
    { get { return true; } }

    public bool IsCompleted
    { get { return true; } }
    #endregion
  }
}

Imports System
Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Text
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  <ServiceContractAttribute(Namespace:="http://microsoft.wcf.documentation")> _
  Public Interface ISampleService

	<OperationContractAttribute> _
	Function SampleMethod(ByVal msg As String) As String

	<OperationContractAttribute(AsyncPattern := True)> _
	Function BeginSampleMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult

	'Note: There is no OperationContractAttribute for the end method.
	Function EndSampleMethod(ByVal result As IAsyncResult) As String

	<OperationContractAttribute(AsyncPattern:=True)> _
	Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult

	' Note: There is no OperationContractAttribute for the end method.
	Function EndServiceAsyncMethod(ByVal result As IAsyncResult) As String
  End Interface

  Public Class SampleService
	  Implements ISampleService
	#Region "ISampleService Members"

	Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
	  Console.WriteLine("Called synchronous sample method with ""{0}""", msg)
		 Return "The sychronous service greets you: " & msg
	End Function

	' This asynchronously implemented operation is never called because 
	' there is a synchronous version of the same method.
	Public Function BeginSampleMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult Implements ISampleService.BeginSampleMethod
	  Console.WriteLine("BeginSampleMethod called with: " & msg)
	  Return New CompletedAsyncResult(Of String)(msg)
	End Function

	Public Function EndSampleMethod(ByVal r As IAsyncResult) As String Implements ISampleService.EndSampleMethod
	  Dim result As CompletedAsyncResult(Of String) = TryCast(r, CompletedAsyncResult(Of String))
	  Console.WriteLine("EndSampleMethod called with: " & result.Data)
	  Return result.Data
	End Function

	Public Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult Implements ISampleService.BeginServiceAsyncMethod
	  Console.WriteLine("BeginServiceAsyncMethod called with: ""{0}""", msg)
	  Return New CompletedAsyncResult(Of String)(msg)
	End Function

	Public Function EndServiceAsyncMethod(ByVal r As IAsyncResult) As String Implements ISampleService.EndServiceAsyncMethod
	  Dim result As CompletedAsyncResult(Of String) = TryCast(r, CompletedAsyncResult(Of String))
	  Console.WriteLine("EndServiceAsyncMethod called with: ""{0}""", result.Data)
	  Return result.Data
	End Function
	#End Region
  End Class

  ' Simple async result implementation.
  Friend Class CompletedAsyncResult(Of T)
	  Implements IAsyncResult
	Private data_Renamed As T

	Public Sub New(ByVal data As T)
		Me.data_Renamed = data
	End Sub

	Public ReadOnly Property Data() As T
		Get
			Return data_Renamed
		End Get
	End Property

	#Region "IAsyncResult Members"
	Public ReadOnly Property AsyncState() As Object Implements IAsyncResult.AsyncState
		Get
			Return CObj(data_Renamed)
		End Get
	End Property

	Public ReadOnly Property AsyncWaitHandle() As WaitHandle Implements IAsyncResult.AsyncWaitHandle
		Get
			Throw New Exception("The method or operation is not implemented.")
		End Get
	End Property

	Public ReadOnly Property CompletedSynchronously() As Boolean Implements IAsyncResult.CompletedSynchronously
		Get
			Return True
		End Get
	End Property

	Public ReadOnly Property IsCompleted() As Boolean Implements IAsyncResult.IsCompleted
		Get
			Return True
		End Get
	End Property
	#End Region
  End Class
End Namespace

Siehe auchSee Also

Entwerfen von DienstverträgenDesigning Service Contracts
Synchrone und asynchrone VorgängeSynchronous and Asynchronous Operations