C# 托管线程一般建议#3

C# 托管线程一般建议#3,c#,.net,multithreading,msdn,C#,.net,Multithreading,Msdn,一般建议3中的这一点是什么意思 不要控制工人的执行 主程序中的线程(使用 例如,事件)。取而代之的是设计 您的程序使工作线程 负责等待工作 可用,执行它,以及 通知程序的其他部分 完成后。如果您的工作线程 不要阻塞,考虑使用线程 池线程。Monitor.PULSELL是 在工作人员 线程阻塞 有人能举例说明吗 --来源:我认为这意味着您不应该手动创建工作线程来处理任务(例如,保存文件),而是应该有一个适当的系统(或使用),您可以将任务/作业排队,而现有工作线程正在等待任务到达(可能使用监视器等待

一般建议3中的这一点是什么意思

不要控制工人的执行 主程序中的线程(使用 例如,事件)。取而代之的是设计 您的程序使工作线程 负责等待工作 可用,执行它,以及 通知程序的其他部分 完成后。如果您的工作线程 不要阻塞,考虑使用线程 池线程。Monitor.PULSELL是 在工作人员 线程阻塞

有人能举例说明吗


--来源:

我认为这意味着您不应该手动创建工作线程来处理任务(例如,保存文件),而是应该有一个适当的系统(或使用),您可以将任务/作业排队,而现有工作线程正在等待任务到达(可能使用监视器等待或自动resetEvent)。这样做意味着您可以重用线程,而不必不断地创建和销毁线程


.NET 4.0有一个新的内置类,其中包含一系列支持类,可以简化这种编程风格,这样您就不必在每个项目中重新发明它。

我认为这一建议也可能是指创建线程,然后对其反复调用
Suspend
Resume
等方法来控制其运行时间


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

,基本上有两种方法可以将工作分配给工作线程。第一种方法是将工作项存储在队列中。当你有工作要做时,你把它推到队列上,并给工人发信号。您的工作线程将如下所示:

while( !quit ) {
    WaitForWork();
    GetWorkItem();
    ExecuteWorkItem();
}
根据建议,这是你应该采取的方法


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

非常感谢,但是Monitor.pulsell()在这个阻塞线程场景中用于什么呢?我指的是微软推荐书中的最后一句话。这句话其实很奇怪。Monitor.PulseAll是一种唤醒已通过调用Monitor.Wait阻塞的线程的方法。老实说,我不确定他们的用意。也许他们只是鼓励你使用监视器等待/脉冲语义。