c# - 使用 Parallel.ForEach() 时防止远程系统过载

标签 c# .net multithreading parallel-processing task-parallel-library

我们构建了这个需要在远程机器(实际上是 MatLab 服务器)上完成一些计算的应用程序。我们使用网络服务连接到 MatLab 服务器并执行计算。

为了加快处理速度,我们使用了 Parallel.ForEach() 以便同时进行多个服务调用。如果我们在将 ParallelOptions.MaxDegreeOfParallelism (DOP) 设置为 4 或其他值时非常保守,则一切正常。 然而,如果我们让框架决定 DOP,它会产生如此多的线程,迫使远程机器跪下并开始发生超时(> 10 分钟)。

我们如何解决这个问题?我希望能够做的是使用响应时间来限制调用。如果响应时间小于 30 秒,继续添加线程,一旦超过 30 秒,就减少使用。有什么建议吗?

注意与此问题中的响应相关:https://stackoverflow.com/a/20192692/896697

最佳答案

最简单的方法是调整最佳数量的并发请求和硬编码,就像您目前所做的那样,但是如果您愿意付出一些努力,还有一些更好的选择。

您可以从 Parallel.ForEach 移动到 using a thread pool .这样,当事情从远程服务器返回时,您可以手动或以编程方式调整可用线程的数量。随着事情变慢/加速,减少/增加可用线程的数量,甚至在需要时杀死它们。

您还可以对上述 using Tasks 做一个变体这是在 .net 中执行并行/异步操作的较新方法。

另一种选择是使用计时器和/或作业模型每 x 毫秒安排一次作业,然后可以根据服务器返回的结果来限制/放宽作业。最简单的入门方法是 using Quartz.Net .

关于c# - 使用 Parallel.ForEach() 时防止远程系统过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22656669/

相关文章:

c# - 如何根据 Active Directory 联合身份验证服务 (ADFS) 验证用户名和密码?

c++ - 从不同线程同步访问和删除列表中的项目。

ios - 如何调用func渲染器(_ :didAdd:for:)

c# - 如何将多个文件压缩到文件夹中直到满足条件?

.net - 在 Windows 8 应用程序中没有 FileTypeFilter 的 FileOpenPicker

c# - 如何在MS Access数据库C#中插入带有主键的记录

c# - .NET-无法构建项目

multithreading - 在 VB6 中设置线程文化

c# - 从 C# 中的 OleDbDataReader 获取检索记录数?

c# - 在没有事件源注册的情况下写入 Windows 应用程序事件日志