简体   繁体   English

如何异步调用wcf服务

[英]How to call wcf service Asynchronously

if wcf service is design the below way then please guide me how call Add() function Asynchronously from client side. 如果wcf服务设计如下,请指导我如何从客户端Asynchronously调用Add()函数。 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);
   }

I think the best way is to convert the APM pattern into the Task pattern , using Task.Factory.FromAsync : 我认为最好的方法是使用Task.Factory.FromAsync 将APM模式转换为任务模式

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

There is no such thing as an async wire communication pattern, and WFC is no exception. 没有异步有线通信模式,WFC也不例外。 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. 换句话说,通过线路,'async'成为回调。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM