2011-03-23 27 views
4

ThreadPriority.LowestThreadPriority.BelowNormal之間有多大的區別。主題優先

我如何知道選擇哪一個?我有一些CPU密集型計算,我不希望它們影響應用程序的其餘部分。

更新

作業正在從System.Threading.Timer調用。在回調方法返回之前,我是否必須重置線程優先級,還是將.Net處理呢?

回答

3

達林和馬特的答案是完全正確的,並且可能是完整的。我只是在這裏添加一些額外的詞語:p

其基本思想是,優先級只相互之間真正具有意義。直到沒有更多的工作需要完成更高的優先級時,纔會完成較低優先級(有效)的工作。這就是爲什麼將進程/線程的優先級提高太多以至於如此危險 - 您可以有效地鎖定系統的其他部分。

還請注意,您的線程優先級會影響系統的其他部分 - 而不僅僅是應用程序的其餘部分。但也要注意,操作系統本身可以自由地調整線程的相對優先級(這就是爲什麼我一直使用「有效」這個詞)。

+0

因此,將線程優先級設置爲低,不僅會改變它在應用程序中的處理方式,還會相對於其他進程中的線程來處理它們。 – jgauffin 2011-03-23 10:04:56

+2

@jgauffin - 絕對;請記住,操作系統可以在其認爲合適的任何進程中對線程應用自己的調整。但這就是爲什麼,例如,Windows任務管理器(taskmgr.exe)將其默認優先級設置爲「高」;所以即使系統由於一些失控程序而與100%cpu掛鉤,它中的線程也有更大的運行機會。 – 2011-03-23 17:33:05

0

你看過嗎? MSDN Thread Priority

根據線程的優先級安排線程執行。用於確定線程執行順序的調度算法因操作系統而異。當用戶界面的焦點在前景和背景之間移動時,操作系統也可以動態調整線程優先級。

具體到你的問題:

最低的線程可以與任何其他優先級的線程之後舉行。

BelowNormal線程可以在具有普通優先級的線程之後和具有最低優先級的線程之前進行調度。

0

The documentation看起來很清楚。如果要在具有任何其他優先級的線程之後安排線程,請使用Lowest。如果要在具有Normal優先級的線程之後和具有Lowest優先級的線程之後安排線程,請使用BelowNormal

+0

因此,只有在應用程序中爲其他線程指定了優先級時,它纔有意義。 – jgauffin 2011-03-23 09:59:46

+0

是的,請記住.Net將爲您的應用程序創建其他線程以及GC等。 – 2014-11-12 08:33:42

1

雖然要小心設置線程的優先級。

儘管您不希望進程影響應用程序響應的其餘部分,但通過降低線程優先級,這可能意味着該線程需要更長的時間才能完成。這可能會對應用程序產生明顯更嚴重的影響,因爲用戶顯然正在等待完成。

您應該測試在不同負載的不同機器上更改優先級的效果。將優先級設置爲最低會對線程的執行時間產生重大影響。

您也可能要考慮有一個選項(這可能會被隱藏在一定程度上)允許用戶控制線程的優先級(或2或中間值的3間至少選擇。

+0

感謝您提出這些問題,但這項工作是在Windows服務/ COM +應用程序中,時間不是問題。 – jgauffin 2011-03-23 10:03:07

0

哪一個取捨就看您的具體情況,但我認爲這樣說:

如果這個過程完全是背景,是不是太挑剔,最低

如果進程需要發生,但時間不是關鍵,低於正常。

如果這個過程和其他一切一樣重要,Normal。

我儘量不使用較高的人,我的計劃是不重要:)

至於差別,這取決於運行的代碼,什麼操作系統決定與優先做的,它不需要聽你設置的那個。