我们正在研究一个老的比较器。
当用户进行调查时,我们同时调用10-30个不同的webservice (REST,SOAP)。很经典所以。每个our服务都由我们的应用程序中的一个客户端重新表示。
所以代码就像:
//Get the request list of client to call
clientRqListToCall = BuildRequest(userContext);
List<Task> taskList = new List<Task>();
//Call the different client
Foreach (ClientRequest clientRq in clientRqListToCall) {
Task task = Task.Run(() => CallClient(clientRq));
taskList.Add(task);
}
//wait client until timeOut
Task mainWaiterTask = Task.WhenAll(taskList);
mainTask.ConfigureAwait(false);
mainTask.Wait(timeout);很简单。(不确定是否需要configureAwait )。每个客户端的响应都存储在ClientRequest的一个字段中,因此我们不使用mainTask.Result (如果客户端超时,我们需要能够继续使用其他客户端的超时,并且它们经常超时!客户端调用行为与防火墙非常相似)。
这个应用程序有点旧,我们的搜索引擎是同步的。不同are服务的调用在不同的CallClient callTree中,根据研究背景,在are服务调用之前调用5到15个不同的功能。每个webservice电话都很长(每个1到15s )!这一点似乎很重要!这些不是pings简单的pings请求。
行动/变化?
所以这是一个I/O约束的问题,我们知道Task.Run可以很好地解决CPU绑定问题,而不是I/O问题,问题是如何使这个代码更好?
我们阅读了很多关于这个主题的不同文章,感谢Stephen (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html),但是我们不确定我们的选择/路线图,这就是为什么我张贴这张票。
今天,我们平均有20到50个客户可以同时进行一项研究。应用程序的工作没有大的问题,我们没有死锁,但有时我们可以看到一些延迟的任务执行在我们这一边。我们的Cpu使用率很低(<10%),Ram也是绿色的(<25%)。
我知道有很多关于任务的票,但是很难把它们合并在一起来匹配我们的问题。我们还读到了自相矛盾的建议。
发布于 2018-11-06 16:36:17
我以前使用过Parallel.ForEach来处理多个I/O操作,我没有看到上面提到过它。我不确定它是否会处理您需要的东西,看到传递给循环的函数对于每个循环都是相同的。也许,再加上一种策略模式/委托,您可以实现您所需要的。
https://stackoverflow.com/questions/53175824
复制相似问题