0

我有一个正在创建的程序(在 C# 中),我看到了两种方法..

1) 等待任意数量的 X 线程完成的作业管理器,完成后它会获得下一个工作块并创建一个新线程并将该块交给它

或者

2)我们创建X个线程来启动,给它们每个工作块,当一个线程完成一个块时,它会要求作业管理器做更多的工作。如果没有更多的工作,它会睡觉,然后再次询问,睡眠时间会越来越长。

该程序将运行并完成,但我可以看到它变成了一项不断寻找更多工作的服务。

每个块将包含许多数据 id,调用数据库以获取一些信息或对数据 id 执行操作,然后将数据 id 上的信息写入数据库。

4

4 回答 4

2

假设您知道在处理多线程数据库操作时需要采取的额外预防措施,听起来您正在描述两种不同的场景。首先,你有几个线程在运行,一旦它们全部完成,它就会寻找新的工作。在第二种情况下,您有几个线程正在运行,并且它们的操作是完全并行的。您的环境将决定采取的正确方法;如果在几个线程中的所有工作都捆绑在一起,而在所有线程完成之前无法继续进行其他工作,则使用前者。如果它们对彼此没有太大影响,请选择后者。

于 2009-03-31T14:54:23.467 回答
1

第二个选项并不正确,因为使睡眠时间逐渐变长意味着您将不必要地保持这些线程被阻塞。

相反,您应该像第二个选项一样拥有一组线程池,但它们使用 WaitHandles 来等待工作并使用生产者/消费者模式。基本上,当生产者指示有工作时,它会向消费者发送一个信号(将有一个管理器来确定哪个线程将获得工作,然后向该线程发出信号),消费者将唤醒并开始工作。

您可能想查看并行任务库。它现在处于测试阶段,但如果你可以使用它并且对它感到满意,我会推荐它,因为它会为你管理很多事情(而且更好,考虑到机器上的核心数量,最佳线程数等)。

于 2009-03-31T14:56:49.497 回答
1

如果工作单元足够大,前一种解决方案(为每个新工作生成一个线程)更容易编码,而且还不错。

第二种解决方案(线程池,带有工作队列),代码更复杂,但支持更小的工作单元。

于 2009-03-31T14:57:15.457 回答
-1

您应该查看ThreadPool.NET 框架中的类,而不是滚动您自己的解决方案。您可以使用该QueueUserWorkItem方法。它应该完全符合您的要求。

于 2009-03-31T14:55:44.650 回答