2009-06-04 34 views
1

是什么,从一般Recommandation#3是什么意思?托管线程一般建议3

不要控制工作的执行从主程序 线程(使用 事件,例如)。相反,设计 您的程序,以便工作线程 负责等待,直到工作 可用,执行它和 完成后通知您的程序 的其他部分。如果您的工作线程 不阻塞,请考虑使用线程 池线程。 Monitor.PulseAll是 有用的情况下,工作人员 线程阻塞。

有人可以通过实例请解释?

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

回答

2

好了,基本上有两种方法可以施舍的工作,你的工作线程。首先是将工作项目存储在队列中。当你有工作要做时,你可以将它推到队列中并向工人发出信号。你的工作线程会是这个样子:

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

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

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

+0

非常感谢,但什么是在这个阻塞线程情况下用于Monitor.PulseAll()?我指的是MS建议中的最后一句。 – aschoenebeck 2009-06-18 16:07:41

1

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

.NET 4.0有一个新的内置Task类,有一大堆支持类,使得这种编程风格更加容易,因此您不必在每个项目中重新发明此类。

0

我认为这个建议也可能是指创建一个线程,然后重复调用诸如SuspendResume的方法来控制它的运行时间。

通常认为线程执行一个包含某种锁定原语(如ManualResetEvent或某个类似的基元)的while循环更好的形式来在需要完成更多工作时发信号通知线程。