在Castle.Windsor中使用带有WCFFacility的客户端基于任务的操作

时间:2013-08-18 18:49:52

标签: wcf castle-windsor async-await wcffacility

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

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

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

所以我想知道如何通过对当前代码进行最少量的更改来启用对基于任务的操作的支持。

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

1 个答案:

答案 0 :(得分: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());