【问题标题】:Managed Threading General Recommendation #3托管线程一般建议 #3
【发布时间】:2009-06-04 14:12:42
【问题描述】:

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

不要控制worker的执行 主程序中的线程(使用 事件,例如)。相反,设计 你的程序让工作线程 负责等到上班 可用,执行它,并且 通知程序的其他部分 等结束了。如果您的工作线程 不要阻塞,考虑使用线程 池线程。 Monitor.PulseAll 是 在工人的情况下很有用 线程阻塞。

谁能举例说明一下?

-- 来源:MSDN - Managed Threading Best Practices

【问题讨论】:

    标签: c# .net multithreading msdn


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢,但是 Monitor.PulseAll() 在这个阻塞线程场景中是用来做什么的?我指的是MS推荐的最后一句话。
    • 其实是一个很奇怪的句子。 Monitor.PulseAll 是一种通过调用 Monitor.Wait 来唤醒阻塞的线程的方法。老实说,我不确定他们在开什么车。也许他们只是在鼓励您使用监视器等待/脉冲语义。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我觉得这个建议也可能是指创建一个线程,然后在它上面重复调用SuspendResume等方法来控制它什么时候运行。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        相关资源
        最近更新 更多