管理线程一般建议#3

时间:2009-06-04 14:12:43

标签: c# .net multithreading msdn

一般推荐#3的含义是什么意思?

  

不要控制工人的执行   来自主程序的线程(使用   事件,例如)。相反,设计   你的程序,以便工作线程   负责等到工作   是可用的,执行它,和   通知程序的其他部分   等结束了。如果你的工作线程   不要阻止,考虑使用线程   池线程。 Monitor.PulseAll是   在工人的情况下很有用   线程阻止。

有人可以通过例子解释吗?

- 资料来源:MSDN - Managed Threading Best Practices

3 个答案:

答案 0 :(得分:2)

嗯,基本上有两种方法可以将工作分配给工作线程。第一种是将工作项存储在队列中。当你有工作要做时,你将它推到队列上并向工人发出信号。你的工作线程看起来像这样:

while( !quit ) {
    WaitForWork();
    GetWorkItem();
    ExecuteWorkItem();
}

根据建议,这是你应该采取的方法。

另一种方法是维护工人队列。当你需要做的工作时,你从队列中抓取一个工人(或者如果它是空的则创建一个)并告诉它运行该项目。第二种方法更难以编码,效率通常较低。

答案 1 :(得分:1)

我认为这意味着您不应该手动创建工作线程来处理任务(例如保存文件),而是要有一个系统(或使用ThreadPool.QueueUserWorkItem),您可以在其中排队任务/ job和现有worker正在等待任务到达(可能使用监视器Wait或AutoResetEvent)。这样做意味着您可以重新使用线程,而不必经常创建和销毁它们。

.NET 4.0有一个新的内置Task类,其中包含许多支持类,使这种编程风格更容易,因此您无需在每个项目中重新创建它。

答案 2 :(得分:0)

我认为这个建议也可能指的是创建一个线程,然后在其上重复调用SuspendResume之类的方法来控制它何时运行。

通常认为让线程执行包含某种锁定原语(如while或类似原语)的ManualResetEvent循环来更好的形式,以便在有更多工作时发出信号要做。