2008-10-16 35 views
2

我有多個線程(運行在IIS上的C#應用​​程序)運行,都需要與同一個MQ後端進行通信。爲了最大限度地減少網絡流量,我只需要在需要完成工作時發送後端請求。將有一個線程來監視是否有工作要完成,並且需要通知其他線程他們也應該開始處理。目前的解決方案涉及的監視線程設置全局變量,並具有其他線程循環和檢查,即在監視線程:當有工作要做時掛起並通知線程

CheckIfWorkAvailable() { 
    while(true) { 
    if (queue.Empty != true) { 
     workToBeDone = true; 
    } 
    }//end while loop 
} 

,然後在工作線程:

DoWork() { 
    while(true) { 
    if (workToBeDone == true) { 
     //do work... 
    } 
    else { 
     Thread.Sleep(x seconds) 
    } 
    }//end while loop 
} 

燦監控線程在工作時通知工作線程,而不是讓他們只是循環和休眠?工作線程還設置了一個計數器,指示它們正在工作,並在工作完成時遞減,以便workToBeDone標誌可以設置爲false。

回答

4

退房WaitHandle及其降序課程。 EventWaitHandle可能適合您的需求。

+0

我只是想說同樣的話。我們在前面寫過的代碼中使用了AutoResetEvent進行類似的線程同步 – 2008-10-16 20:01:46

1

在你的情況下,也有可能直接使用ThreadPool類。這意味着你不需要設置你將要消耗的線程,它也允許你根據要完成的工作來設置線程。

如果您在項目中使用CTP,您可能需要查看TPL,因爲它具有一些更高級的同步和任務功能。

4

除了Kent指出的WaitHandle類,簡單的Monitor.Wait和Monitor。 Pulse/PulseAll可以輕鬆做到這一點。它們比事件句柄「更輕」,儘管有些更原始。 (你不能等待多臺顯示器等)

我在我的threading article中有一個這樣的例子(作爲生產者消費者隊列)。

0

如果您希望所有工作線程在滿足狀態時繼續進行(看起來像您在此處想要的),請使用ManualResetEvent。每當某些工作變得可用時,只希望給單個工作人員發信號時使用AutoResetEvent。當您想要允許特定數量的線程繼續時使用信號量。幾乎從不使用全局變量來處理這種類型的事情,如果這樣做,則將其標記爲volatile。

在這種情況下要小心。您不希望導致「鎖車隊」發生,因爲您釋放所有工作人員以在每次單個物品被釋放時必須一次全部進入隊列,以致不得不再次等待。

相關問題