【发布时间】:2009-06-04 14:12:42
【问题描述】:
第 3 条一般性建议中的这句话是什么意思?
不要控制worker的执行 主程序中的线程(使用 事件,例如)。相反,设计 你的程序让工作线程 负责等到上班 可用,执行它,并且 通知程序的其他部分 等结束了。如果您的工作线程 不要阻塞,考虑使用线程 池线程。 Monitor.PulseAll 是 在工人的情况下很有用 线程阻塞。
谁能举例说明一下?
【问题讨论】:
标签: c# .net multithreading msdn
第 3 条一般性建议中的这句话是什么意思?
不要控制worker的执行 主程序中的线程(使用 事件,例如)。相反,设计 你的程序让工作线程 负责等到上班 可用,执行它,并且 通知程序的其他部分 等结束了。如果您的工作线程 不要阻塞,考虑使用线程 池线程。 Monitor.PulseAll 是 在工人的情况下很有用 线程阻塞。
谁能举例说明一下?
【问题讨论】:
标签: c# .net multithreading msdn
嗯,基本上有两种方法可以将工作分配给工作线程。第一个是将工作项存储在队列中。当你有工作要做时,你把它推到队列中并向工人发出信号。您的工作线程看起来像这样:
while( !quit ) {
WaitForWork();
GetWorkItem();
ExecuteWorkItem();
}
根据建议,这是您应该采取的方法。
另一种方法是维护一个工人队列。当您有需要做的工作时,您从队列中抓取一个工作人员(如果它为空,则创建一个)并告诉它运行该项目。第二种方法更难编码,通常效率较低。
【讨论】:
我认为这意味着您不应该手动创建工作线程来处理任务(例如保存文件),而应该有一个系统(或使用ThreadPool.QueueUserWorkItem),您可以在其中将任务/作业排入队列并现有工作人员正在等待任务到达(可能使用监视器等待或 AutoResetEvent)。这样做意味着您可以重复使用线程,而不必不断地创建和销毁它们。
.NET 4.0 有一个新的内置 Task 类和一堆支持类,使这种编程风格更容易,这样您就不必在每个项目中重新发明它。
【讨论】:
我觉得这个建议也可能是指创建一个线程,然后在它上面重复调用Suspend和Resume等方法来控制它什么时候运行。
通常认为更好的形式是让线程执行包含某种锁定原语(如ManualResetEvent 或类似原语)的while 循环,以便在有更多工作要做时向线程发出信号。
【讨论】: