一般推荐#3的含义是什么意思?
不要控制工人的执行 来自主程序的线程(使用 事件,例如)。相反,设计 你的程序,以便工作线程 负责等到工作 是可用的,执行它,和 通知程序的其他部分 等结束了。如果你的工作线程 不要阻止,考虑使用线程 池线程。 Monitor.PulseAll是 在工人的情况下很有用 线程阻止。
有人可以通过例子解释吗?
答案 0 :(得分:2)
嗯,基本上有两种方法可以将工作分配给工作线程。第一种是将工作项存储在队列中。当你有工作要做时,你将它推到队列上并向工人发出信号。你的工作线程看起来像这样:
while( !quit ) {
WaitForWork();
GetWorkItem();
ExecuteWorkItem();
}
根据建议,这是你应该采取的方法。
另一种方法是维护工人队列。当你需要做的工作时,你从队列中抓取一个工人(或者如果它是空的则创建一个)并告诉它运行该项目。第二种方法更难以编码,效率通常较低。
答案 1 :(得分:1)
我认为这意味着您不应该手动创建工作线程来处理任务(例如保存文件),而是要有一个系统(或使用ThreadPool.QueueUserWorkItem),您可以在其中排队任务/ job和现有worker正在等待任务到达(可能使用监视器Wait或AutoResetEvent)。这样做意味着您可以重新使用线程,而不必经常创建和销毁它们。
.NET 4.0有一个新的内置Task类,其中包含许多支持类,使这种编程风格更容易,因此您无需在每个项目中重新创建它。
答案 2 :(得分:0)
我认为这个建议也可能指的是创建一个线程,然后在其上重复调用Suspend
和Resume
之类的方法来控制它何时运行。
通常认为让线程执行包含某种锁定原语(如while
或类似原语)的ManualResetEvent
循环来更好的形式,以便在有更多工作时发出信号要做。