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
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.
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
Bir hizmet işlemine zaman uyumsuz olarak erişmek için istemcisini oluşturun ve (örneğin,
BeginAdd
) öğesini çağırınBegin[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ırEnd<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 AsyncPatterntrue
ayarlar. 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