创建新线程或为线程获得更多工作

时间:2009-03-31 14:50:20

标签: c# multithreading context-switch

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

1)等待任意数量的X线程完成的作业管理器,完成后获得下一部分工作并创建一个新线程并将其提供给那个块

2)我们创建X线程来启动,为每个线程提供一大块工作,当线程完成一个块时,它会要求作业管理器进行更多工作。如果没有任何工作,它会睡觉,然后再次询问,睡眠逐渐变长。

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

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

4 个答案:

答案 0 :(得分:2)

假设您了解在处理多线程数据库操作时需要采取的其他预防措施,听起来您正在描述两种不同的方案。在第一个,你有几个线程在运行,一旦所有线程完成它将寻找新的工作。在第二个中,您运行了多个线程,它们的操作完全并行。您的环境将决定采取的正确方法;如果在几个线程中存在所有工作的东西,其中额外的工作不能继续,直到所有工作完成,然后与前者。如果它们彼此之间没有太大影响,请选择后者。

答案 1 :(得分:1)

第二种选择并不正确,因为使睡眠时间逐渐变长意味着您将不必要地阻止这些线程。

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

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

答案 2 :(得分:1)

前一个解决方案(为每个新工作生成一个线程),如果工作单元足够大,则更容易编码,也不会太糟糕。

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

答案 3 :(得分:-1)

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