2009-06-04 88 views
1

是什麼,從一般Recommandation#3是什麼意思?託管線程一般建議3

不要控制工作的執行從主程序 線程(使用 事件,例如)。相反,設計 您的程序,以便工作線程 負責等待,直到工作 可用,執行它和 完成後通知您的程序 的其他部分。如果您的工作線程 不阻塞,請考慮使用線程 池線程。 Monitor.PulseAll是 有用的情況下,工作人員 線程阻塞。

有人可以通過實例請解釋?

- 資料來源:MSDN - Managed Threading Best Practices

回答

2

好了,基本上有兩種方法可以施捨的工作,你的工作線程。首先是將工作項目存儲在隊列中。當你有工作要做時,你可以將它推到隊列中並向工人發出信號。你的工作線程會是這個樣子:

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

這是你應該採取的辦法,根據該建議。

另一種方法是保持工人的隊列。當你需要做的工作時,你從隊列中抓取一名工作人員(或者創建一個空的工作人員)並告訴它運行該項目。第二種方法更難編碼,效率通常較低。

+0

非常感謝,但什麼是在這個阻塞線程情況下用於Monitor.PulseAll()?我指的是MS建議中的最後一句。 – aschoenebeck 2009-06-18 16:07:41

1

我認爲這意味着,你不應該手動創建工作線程來處理任務(例如保存文件),而是有一個適當的系統(或者使用ThreadPool.QueueUserWorkItem),其中您可以排隊任務/作業,並且現有的工作人員正在等待任務到達(可能使用監視器Wait或AutoResetEvent)。這樣做意味着您可以重新使用線程,而不必不斷創建並銷燬它們。

.NET 4.0有一個新的內置Task類,有一大堆支持類,使得這種編程風格更加容易,因此您不必在每個項目中重新發明此類。

0

我認爲這個建議也可能是指創建一個線程,然後重複調用諸如SuspendResume的方法來控制它的運行時間。

通常認爲線程執行一個包含某種鎖定原語(如ManualResetEvent或某個類似的基元)的while循環更好的形式來在需要完成更多工作時發信號通知線程。