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