Nasıl yapılır: Kanal Fabrikası Kullanarak İşlemlere Zaman Uyumsuz Olarak Çağrı Yapma

Bu konu, bir istemcinin tabanlı bir istemci uygulaması kullanırken ChannelFactory<TChannel>bir hizmet işlemine zaman uyumsuz olarak nasıl erişebileceğini kapsar. (Bir hizmeti çağırmak için bir System.ServiceModel.ClientBase<TChannel> nesne kullanırken olay temelli zaman uyumsuz çağırma modelini kullanabilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Hizmet İşlemlerini Zaman Uyumsuz Olarak Çağırma. Olay tabanlı zaman uyumsuz çağırma modeli hakkında daha fazla bilgi için bkz . Olay Tabanlı Zaman Uyumsuz Desen (EAP).)

Bu konudaki hizmet arabirimini ICalculator uygular. İstemci, bu arabirimdeki işlemleri zaman uyumsuz olarak çağırabilir; bu da gibi Add işlemlerin iki yönteme BeginAdd ayrıldığı ve EndAddçağrısının ilki tarafından başlatılan ve ikincisi işlem tamamlandığında sonucu alan işlemlerin olduğu anlamına gelir. Bir hizmette bir işlemin zaman uyumsuz olarak nasıl uygulanacaklarını gösteren bir örnek için bkz . Nasıl yapılır: Zaman Uyumsuz Hizmet İşlemi Uygulama. Zaman uyumlu ve zaman uyumsuz işlemler hakkında ayrıntılı bilgi için bkz . Zaman Uyumlu ve Zaman Uyumsuz İşlemler.

Yordam

WCF hizmet işlemlerini zaman uyumsuz olarak çağırmak için

  1. ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) aracını aşağıdaki komutta gösterildiği gibi seçeneğiyle /async çalıştırın.

    svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost:8000/servicemodelsamples/service/mex /a
    

    Bu işlem için hizmet sözleşmesinin zaman uyumsuz bir istemci sürümünü oluşturur.

  2. Aşağıdaki örnek kodda gösterildiği gibi, zaman uyumsuz işlem tamamlandığında çağrılacak bir geri çağırma işlevi oluşturun.

    static void AddCallback(IAsyncResult ar)
    {
        double result = ((CalculatorClient)ar.AsyncState).EndAdd(ar);
        Console.WriteLine("Add Result: {0}", result);
    }
    
    Private Shared Sub AddCallback(ByVal ar As IAsyncResult)
        Dim result = (CType(ar.AsyncState, CalculatorClient)).EndAdd(ar)
        Console.WriteLine("Add Result: {0}", result)
    End Sub
    
  3. Bir hizmet işlemine zaman uyumsuz olarak erişmek için istemcisini oluşturun ve (örneğin, BeginAdd) öğesini çağırın Begin[Operation] ve aşağıdaki örnek kodda gösterildiği gibi bir geri çağırma işlevi belirtin.

    ChannelFactory<ICalculatorChannel> factory = new ChannelFactory<ICalculatorChannel>();
    ICalculatorChannel channelClient = factory.CreateChannel();
    
    // BeginAdd
    double value1 = 100.00D;
    double value2 = 15.99D;
    
    IAsyncResult arAdd = channelClient.BeginAdd(value1, value2, AddCallback, channelClient);
    Console.WriteLine("Add({0},{1})", value1, value2);
    
    Dim factory As New ChannelFactory(Of ICalculatorChannel)()
    Dim channelClient As ICalculatorChannel = factory.CreateChannel()
    
    ' BeginAdd
    Dim value1 = 100.0R
    Dim value2 = 15.99R
    
    Dim arAdd As IAsyncResult = channelClient.BeginAdd(value1, value2, AddressOf AddCallback, channelClient)
    Console.WriteLine("Add({0},{1})", value1, value2)
    

    Geri çağırma işlevi yürütürken, istemci sonucu almak için (örneğin, EndAdd) çağırır End<operation> .

Örnek

Önceki yordamda kullanılan istemci koduyla kullanılan hizmet, aşağıdaki kodda gösterildiği gibi arabirimi uygular ICalculator . Hizmet tarafında, Add önceki istemci adımları istemcide zaman uyumsuz olarak çağrılsa bile, sözleşmenin ve Subtract işlemleri Windows Communication Foundation (WCF) çalışma zamanı tarafından zaman uyumlu olarak çağrılır. Multiply ve Divide işlemleri, istemci bunları zaman uyumlu olarak çağırsa bile hizmeti hizmet tarafında zaman uyumsuz olarak çağırmak için kullanılır. Bu örnek özelliğini olarak AsyncPatterntrueayarlar. Bu özellik ayarı, .NET Framework zaman uyumsuz deseninin uygulanmasıyla birlikte çalışma zamanına işlemi zaman uyumsuz olarak çağırmasını söyler.

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);

    [OperationContract]
    double Subtract(double n1, double n2);

    //Multiply involves some file I/O so we'll make it Async.
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginMultiply(double n1, double n2, AsyncCallback callback, object state);
    double EndMultiply(IAsyncResult ar);

    //Divide involves some file I/O so we'll make it Async.
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginDivide(double n1, double n2, AsyncCallback callback, object state);
    double EndDivide(IAsyncResult ar);
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
    <OperationContract> _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double

    <OperationContract> _
    Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double

    'Multiply involves some file I/O so we'll make it Async.
    <OperationContract(AsyncPattern:=True)> _
    Function BeginMultiply(ByVal n1 As Double, ByVal n2 As Double, ByVal callback As AsyncCallback, ByVal state As Object) As IAsyncResult
    Function EndMultiply(ByVal ar As IAsyncResult) As Double

    'Divide involves some file I/O so we'll make it Async.
    <OperationContract(AsyncPattern:=True)> _
    Function BeginDivide(ByVal n1 As Double, ByVal n2 As Double, ByVal callback As AsyncCallback, ByVal state As Object) As IAsyncResult
    Function EndDivide(ByVal ar As IAsyncResult) As Double
End Interface