【发布时间】:2013-12-21 03:33:43
【问题描述】:
我有一段这样的代码:
foreach (var e in foobar)
{
var myObj = new MyObj();
GenericResult res = soapClient.doSomething(e);
if(res.success == true){
myObj.a = e.a;
myObj.b = e.b;
}
}
每个soapRequest 大约需要500 毫秒,有时foobar 是1000 多个元素,所以我浪费了大量时间等待soapClient 响应。我试过使用Parallel.ForEach,但它不起作用,因为 SOAP 提供程序只接受序列化请求。提供商建议使用 async 调用,如 soapClient.doSomthingAsync 问题是在得到soapClient 响应之前我无事可做。
我想到的唯一解决方案是在soap调用中使用Parallel.ForEach和lock
【问题讨论】:
-
如果您必须发出 1000 个请求,那么您必须发出 1000 个请求……也许您可以为您正在调用的 SOAP API 寻找一个更好的模型 - 是否在您的控制之下?你能创建多个
soapClient的实例吗? -
@DanPuzey 不,API 不在我的控制之下,我不能使用更多的 soapClient 实例,因为检查多个请求是明智的(我正在使用 API 密钥)。我现在正在使用带锁的Parallel For,它的速度稍微快一些。我认为这是最好的解决方案:(
-
你知道这台服务器是否使用 HTTP 1.1?...默认使用持久连接。否则,如果是 HTTP 1.0,您可以请求保持连接打开(保持活动状态),这样您就不必为每个请求继续进行 TCP 握手。您需要查看网络上的流量(使用 WireShark/Fiddler)...stackoverflow.com/questions/4699013/… ...另外,您如何生成“代理”(添加服务参考,或添加 Web 参考?).. .是WCF吗? (也许你正在达到一些限制)
-
您还可以增加对该主机的“连接”限制....blogs.msdn.com/b/jpsanders/archive/2009/05/20/…
-
你无法加快速度。您可以请求所有者添加处理批量数据的方法,您想在此处执行此操作。只进行一次调用并给它一个 e 列表并返回一个结果列表会更好。
标签: c# multithreading soap asynchronous async-await