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

在Castle.Windsor中使用客户端基于任务的操作和WCFFacility,wcf,castle-windsor,async-await,wcffacility,Wcf,Castle Windsor,Async Await,Wcffacility,我想利用新的基于任务的WCF客户端操作。我目前使用的WCFFacility如下所示: container.Register(Component .For<IAdminService>() .LifeStyle.Transient .AsWcfClient(new DefaultClientModel() { Endpoint = WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize)

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

container.Register(Component
    .For<IAdminService>()
    .LifeStyle.Transient
    .AsWcfClient(new DefaultClientModel()
    {
        Endpoint = WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize)
            .At(addr)
    }));
container.Register(组件
.对于()
.短暂的
.AsWcfClient(新的DefaultClientModel()
{
Endpoint=WCFHelpers.BasicHttp(settings.MaxReceivedMessageSize)
.At(地址)
}));
其中,IAdminService是ServiceContract类。所有有关基于任务的操作的MSDN文章都提到在导入服务引用时设置“基于任务的操作”复选框。但是在我当前使用的样式中,没有导入的服务引用,因为我只是直接引用服务契约接口

因此,我想知道如何在对当前代码进行最少更改的情况下支持基于任务的操作


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

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));
    }
}
公共静态类ClientExtensions
{
公共静态异步任务CallAsync(此TProxy代理,Func方法)
{
返回wait Task.Factory.fromsync(proxy.BeginWcfCall(方法),ar=>proxy.EndWcfCall(ar));
}
公共静态异步任务CallAsync(此TProxy代理,操作方法)
{
wait Task.Factory.fromsync(proxy.BeginWcfCall(方法),ar=>proxy.EndWcfCall(ar));
}
}
在异步方法中,可以这样调用它们:

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

// Action
await client.CallAsync(p => p.DoSomething());
//Func
var result=await client.CallAsync(p=>p.SayThisNumber(42));
//行动
等待client.CallAsync(p=>p.DoSomething());

您是否尝试将
IAdminService
中的方法更改为
Task
-返回方法?我认为这应该行得通。我已经派生了一个新接口来添加任务返回方法。它只起了一半的作用:调用将其发送到服务器,但客户端上的任务似乎从未完成——它最终超时。我在客户端扩展中找不到解决方案Do not wait,只返回从工厂创建的任务,然后使用者将等待、等待或继续执行另一个任务,或者调用方需要的任何任务。检查“从APM到TAP”部分