2014-01-31 3 views
2

Если служба wcf разработана ниже, пожалуйста, назовите меня, как вызов Add() функции Asynchronously с клиентской стороны. благодаряКак вызвать услугу wcf Асинхронно

[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); 
    } 

ответ

10

Я думаю, что лучший способ заключается в convert the APM pattern into the Task pattern, используя 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); 
    } 
} 

Использование:

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

Я знаком с APM, но не с TASK, но хотел бы знать, что вы использовали здесь ссылку на функцию asyncCallback, но когда вы вызываете AddAsync(), то вы не отправляете ссылку функции asyncCallback .... почему? – Mou

+0

@Mou, 'asyncCallback' будет поставляться внутренне с помощью реализации Framework From From, которая вызывает мою лямбду. – Noseratio

0

Там нет такого понятия, как шаблон асинхронной проводной связи, и WFC не является исключением. Переход на асинхронный по проводам требует существенных изменений в вашем сервисе и вашем контракте. В частности, ваш контракт должен быть двунаправленным контрактом, а «конец» должен быть перенесен из службы клиенту вместе с результатом. Другими словами, через провод «асинхронный» становится обратным вызовом.

Смежные вопросы