2

if wcf service is design the below way then please guide me how call Add() function Asynchronously from client side. thanks

[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);
   }
noseratio
  • 59,932
  • 34
  • 208
  • 486
Thomas
  • 33,544
  • 126
  • 357
  • 626

2 Answers2

10

I think the best way is to convert the APM pattern into the Task pattern, using Task.Factory.FromAsync:

public static class WcfExt
{
    public static Task<int> 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);
    }
}

Usage:

IAddTwoNumbers service = CreateWcfClientProxy();
int result = await service.AddAsync(a, b);
noseratio
  • 59,932
  • 34
  • 208
  • 486
  • i am familiar with APM but not with TASK but like to know u used here asyncCallback function reference but when u r calling AddAsync() then u are not sending asyncCallback function reference....why? – Mou Feb 02 '14 at 17:56
  • @Mou, `asyncCallback` will be supplied internally by the Framework implementation of `FromAsync`, when it calls my lambda. – noseratio Feb 02 '14 at 22:06
0

There is no such thing as an async wire communication pattern, and WFC is no exception. Going async across the wire requires fundamental changes in your service and your contract. Specifically your contract has to be a bidirectional contract and the 'end' must be pushed from the service to the client, along with the result. In other words, across the wire the 'async' becomes a callback.

Scott Chamberlain
  • 124,994
  • 33
  • 282
  • 431
Remus Rusanu
  • 288,378
  • 40
  • 442
  • 569