1

第 3 条一般性建议中的这句话是什么意思?

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

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

-- 来源:MSDN - 托管线程最佳实践

4

3 回答 3

2

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

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

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

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

于 2009-06-09T04:46:20.127 回答
1

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

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

于 2009-06-04T15:22:27.647 回答
0

我想这个建议也可能是指创建一个线程,然后在它上面反复调用和之类的方法SuspendResume控制它什么时候运行。

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

于 2009-06-05T02:08:19.633 回答