2

我想为 WCF 客户端利用新的基于任务的操作。我目前正在使用 WCFFacility 如下:

container.Register(Component
    .For<IAdminService>()
    .LifeStyle.Transient
    .AsWcfClient(new DefaultClientModel()
    {
        Endpoint = WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize)
            .At(addr)
    }));

其中 IAdminService 是 ServiceContract 类。所有关于基于任务的操作的 MSDN 文章都指在导入服务引用时设置“基于任务的操作”复选框。但是在我目前使用的样式中,并没有导入服务引用,因为我简单直接引用了服务契约接口。

所以我想知道如何在对当前代码进行最少更改的情况下启用对基于任务的操作的支持。

[顺便说一句 - WCFHelpers 是一个实用程序类,它生成一个 BindEndpointModel 并且在执行此代码之前将 addr 设置为适当的端点地址]

4

1 回答 1

2

WCFFacility 提供了一些符合旧异步模式的扩展方法。这些可以很容易地转换为任务。

试试这些扩展方法:

public static class ClientExtensions
{
    public static async Task<TResult> CallAsync<TProxy, TResult>(this TProxy proxy, Func<TProxy, TResult> method)
    {
        return await Task.Factory.FromAsync(proxy.BeginWcfCall(method), ar => proxy.EndWcfCall<TResult>(ar));
    }

    public static async Task CallAsync<TProxy>(this TProxy proxy, Action<TProxy> method)
    {
        await Task.Factory.FromAsync(proxy.BeginWcfCall(method), ar => proxy.EndWcfCall(ar));
    }
}

在异步方法中,它们可以这样调用:

// Func<T>
var result = await client.CallAsync(p => p.SayThisNumber(42));

// Action
await client.CallAsync(p => p.DoSomething());
于 2014-01-05T10:59:44.947 回答