Cómo llamar al servicio wcf de forma asíncrona

Si el servicio wcf está diseñado de la manera que se indica a continuación, por favor, guíame sobre cómo llamar a la función Add() manera Asynchronously desde el lado del cliente. Gracias

 [ServiceContract] public interface IAddTwoNumbers { // If the asynchronous method pair // appears on the client channel, the client can call // them asynchronously to prevent blocking. [OperationContract (AsyncPattern=true)] IAsyncResult BeginAdd(int a, int b, AsyncCallback cb, AsyncState s); [OperationContract] int EndAdd(IAsyncResult r); // This is a synchronous version of the BeginAdd/EndAdd pair. // It appears in the client channel code by default. [OperationContract] int Add(int a, int b); } 

Creo que la mejor manera es convertir el patrón APM en el patrón Task , usando Task.Factory.FromAsync :

 public static class WcfExt { public static Task AddAsync(this IAddTwoNumbers service, int a, int b) { return Task.Factory.FromAsync( (asyncCallback, asyncState) => service.BeginAdd(a, b, asyncCallback, asyncState), (asyncResult) => service.EndAdd(asyncResult), null); } } 

Uso:

 IAddTwoNumbers service = CreateWcfClientProxy(); int result = await service.AddAsync(a, b); 

No existe un patrón de comunicación por cable asíncrono, y WFC no es una excepción. Ir de manera asincrónica a través del cable requiere cambios fundamentales en su servicio y su contrato. Específicamente, su contrato tiene que ser un contrato bidireccional y el ‘final’ debe ser presionado desde el servicio hasta el cliente, junto con el resultado. En otras palabras, a través del cable el ‘async’ se convierte en una callback.