Joc*_*ick 5 c# parallel-processing multithreading task-parallel-library parallel.foreach
我们构建了这个应用程序,需要在远程计算机(实际上是 MatLab 服务器)上完成一些计算。我们使用 Web 服务连接到 MatLab 服务器并执行计算。
为了加快速度,我们使用了Parallel.ForEach()同时进行多个服务调用的方法。如果我们非常保守地将ParallelOptions.MaxDegreeOfParallelism(DOP) 设置为 4 或其他值,那么一切都会运行良好。然而,如果我们让框架决定 DOP,它将产生如此多的线程,从而迫使远程计算机屈服并开始发生超时(> 10 分钟)。
我们该如何解决这个问题呢?我希望能够做的是利用响应时间来限制调用。如果响应时间小于 30 秒,则继续添加线程,一旦超过 30 秒,就减少使用。有什么建议么?
注意与此问题中的响应相关:Parallel Foreach webservice call。
最简单的方法是调整最佳数量的并发请求并对其进行硬编码,就像您到目前为止所做的那样,但是如果您愿意付出一些努力,还有一些更好的选择。
您可以从 Parallel.ForEach 转向使用线程池。这样,当事情从远程服务器返回时,您可以手动或以编程方式调整可用线程的数量。随着速度减慢/加速,减少/增加可用线程的数量,甚至在需要时杀死它们。
您还可以使用任务来执行上述操作的变体,这是在 .net 中执行并行/异步操作的较新方法。
另一种选择是使用计时器和/或作业模型每 x 毫秒安排一次作业,然后可以在从服务器返回结果时对其进行限制/放宽。最简单的入门方法是使用 Quartz.Net。