C# 异步WCF客户端包装器

C# 异步WCF客户端包装器,c#,wcf,asynchronous,C#,Wcf,Asynchronous,我已经根据创建了自己的WCF调用包装器 public委托void-UseServiceDelegate(T-proxy); 公共静态类服务 { 公共静态ChannelFactory\u ChannelFactory=新ChannelFactory(“”); 公共静态无效使用(UseServiceDelegate代码块) { IClientChannel代理=(IClientChannel)_channelFactory.CreateChannel(); 布尔成功=假; 尝试 { 代码块((

我已经根据创建了自己的WCF调用包装器

public委托void-UseServiceDelegate(T-proxy);
公共静态类服务
{ 
公共静态ChannelFactory\u ChannelFactory=新ChannelFactory(“”);
公共静态无效使用(UseServiceDelegate代码块)
{ 
IClientChannel代理=(IClientChannel)_channelFactory.CreateChannel();
布尔成功=假;
尝试
{ 
代码块((T)代理);
proxy.Close();
成功=真实;
} 
最后
{ 
如果(!成功)
{ 
proxy.Abort();
} 
} 
} 
} 
我可以称之为:

Service<IOrderService>.Use(orderService => 
{ 
    orderService.PlaceOrder(request); 
}); 
Service.Use(orderService=>
{ 
orderService.PlaceOrder(请求);
}); 
如何为异步WCF调用设置此选项

我已经尝试过的是:

public delegate Task UseAsyncServiceDelegate<T>(T proxy);

public static async Task UseAsync(UseAsyncServiceDelegate<T> codeBlock)
{
    IClientChannel proxy = (IClientChannel)_channelFactory.CreateChannel();
    bool success = false;
    try
    {
        await codeBlock((T)proxy);
        proxy.Close();
        success = true;
    }
    finally
    {
        if (!success)
        {
            proxy.Abort();
        }
    }
}
公共委托任务UseAncyServiceDelegate(T代理);
公共静态异步任务UseAncy(UseAncyServiceDelegate代码块)
{
IClientChannel代理=(IClientChannel)_channelFactory.CreateChannel();
布尔成功=假;
尝试
{
等待代码块((T)代理);
proxy.Close();
成功=真实;
}
最后
{
如果(!成功)
{
proxy.Abort();
}
}
}

但是它不起作用。

这是如何比使用有所改进的?您可以对svcutil或visualstudio生成的代理使用相同的代码。你不必直接与频道合作。这样,您就不必重新实现异步方法。在任何情况下,请检查代理生成的代码。您将看到生成的异步方法实际上在强类型通道上调用了类似的方法。使用时遇到的第二个问题是:我想在我的服务中实现一个异常处理。Use和Service.Use异步函数非常好的提示,我将检查生成的函数原样,是的。这并不意味着你应该避开代理。这意味着您应该注意如何关闭代理。与链接问题不同,您的代码使用基本的
IClientChannel
,而不是强类型的
IOrderService
,这比使用
有什么改进?您可以对svcutil或visualstudio生成的代理使用相同的代码。你不必直接与频道合作。这样,您就不必重新实现异步方法。在任何情况下,请检查代理生成的代码。您将看到生成的异步方法实际上在强类型通道上调用了类似的方法。使用时遇到的第二个问题是:我想在我的服务中实现一个异常处理。Use和Service.Use异步函数非常好的提示,我将检查生成的函数原样,是的。这并不意味着你应该避开代理。这意味着您应该注意如何关闭代理。与链接问题不同,您的代码使用基本的
IClientChannel
,而不是强类型的
IOrderService
public delegate Task UseAsyncServiceDelegate<T>(T proxy);

public static async Task UseAsync(UseAsyncServiceDelegate<T> codeBlock)
{
    IClientChannel proxy = (IClientChannel)_channelFactory.CreateChannel();
    bool success = false;
    try
    {
        await codeBlock((T)proxy);
        proxy.Close();
        success = true;
    }
    finally
    {
        if (!success)
        {
            proxy.Abort();
        }
    }
}