gpt4 book ai didi

WCF ChannelFactory 异步调用

转载 作者:行者123 更新时间:2023-12-04 12:32:57 25 4
gpt4 key购买 nike

我正在玩 WCF 和 TPL 异步库
我需要的是能够请求多个 WCF 方法并等到所有方法都完成,到目前为止,我发现在 .NET 4.5 中有非常方便的方法 Task.Factory.ContinueWhenAll 可用于等待所有调用完成

我发现以下方式以异步方式请求 WCF 调用
选项 1. 通过使用“添加引用”对话框生成的代理和选项“生成基于任务的操作”-> [例如此处][1] - 在我的情况下不是一个选项,因为我们使用的是原始 ChannelFactory
选项 2. 通过将同步调用包装在任务中,例如

    ChannelFactory<IService1> factory = new ChannelFactory<IService1>("BasicHttpBinding_IService1");  

Task<string> t1 = Task<string>.Factory.StartNew(() => { return factory.CreateChannel().GetData(2); });
Task<string> t2 = Task<string>.Factory.StartNew(() => { return factory.CreateChannel().GetData(5); });

Task.Factory.ContinueWhenAll(new[] { t1, t2 }, t =>
{
foreach (var task in t)
{
//get result here
}
});

选项 3. 通过创建合约接口(interface)的客户端异步版本,例如
[ServiceContract(Namespace = "X", Name = "TheContract")]//Server side contract
public interface IService1
{
[OperationContract]
string GetData(int value);
}

[ServiceContract(Namespace = "X", Name = "TheContract")]//client side contract
public interface IService1Async
{
[OperationContract]
string GetData(int value);

[OperationContract]
Task<string> GetDataAsync(int value);
}

有了这个我可以异步调用方法,例如
 ChannelFactory<IService1Async> factory = new ChannelFactory<IService1Async>("BasicHttpBinding_IService2");

var t1 = factory.CreateChannel().GetDataAsync(2);
var t2 = factory.CreateChannel().GetDataAsync(5);

Task.Factory.ContinueWhenAll(new[] { t1, t2 }, (Task<string>[] t) =>
{
foreach (var task in t)
{
//get result here
}
});

所以问题如下,与选项2相比,选项3有什么优势,在选项2中调用WCF方法是否正确?选项 2 与 3 相比有一个优点,即无需创建客户端合约接口(interface)。

最佳答案

在选项 #2 中,每次调用 GetData()将在方法执行的整个过程中阻塞一个线程。在选项 #3 中,GetDataAsync()操作正在进行中,没有线程被它阻塞。

这意味着选项 #3 更有效,您应该使用 -Async如果效率对您很重要,请使用该方法的版本。

关于WCF ChannelFactory 异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com