我有一段这样的代码:
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响应之前,我没有任何事情要做。
我想到的唯一解决方案是在肥皂使用中使用Parallel.ForEach
和lock
答案 0 :(得分:0)
你可以尝试一些事情。
对服务调用应用何种类型的身份验证。如果服务等对AD进行身份验证,则应确保仅对第一个呼叫进行身份验证,其余呼叫仅依赖于该呼叫。 AD身份验证可能需要相当长的时间(0.3 - 1.0 s)
尝试安装Fiddler并将其用作WCF代理。 Fiddler将为您提供分解在服务呼叫执行的各个部分花费的时间的方法。
您是否尝试ping过目标服务器 - ping时间是否可以接受?
与以下调用相比,第一次调用花费了多少时间。第一次调用总是需要花费大量时间,因为CLR运行时必须生成动态XML代码的船载。仅生成XmlSerializer JIT代码是昂贵的,因为它动态生成C#代码,CSC编译器的踢,并加载生成的DLL。您可以查看一下SGEN工具,它可以在编译时生成XmlSerializer DLL而不是运行时(注意这只会对第一个执行时间有帮助)
在doSomething()的执行过程中,我无法看到实际花费多少时间在服务器端,因此很难看到实际花费了多少时间在网络上。有故障的网络硬件,电缆,交换机以及防火墙,路由表,SLA等可能会对您可以从中获得的性能产生负面影响。
正如已经提到的那样,拥有如此繁琐的接口,远远不是最佳的,服务所有者可能会遇到各种服务器端性能问题,如果这是他们暴露接口的正常方式 - 但是这是另一个故事:)