2009-10-16 105 views
5

當某些cpu時間可用時,我有幾個低進度任務需要執行。如果其他更多導入任務正在運行,我不希望執行此任務。也就是說,如果正常/高優先級任務到來,我希望低重要性任務暫停,直到重要性任務完成。線程池中的C#低線程優先級

有一個相當大的低重要性任務要執行(50至1000)。所以我不想爲每個任務創建一個線程。但是我相信線程池不允許一些優先級規範,是嗎?

你會如何解決這個問題?

回答

2

您可以新建一個主題並使用Dispatcher發送它需要various priorities

優先級有點以用戶界面爲中心,但這並不重要。

2

您不應該嘲笑常規ThreadPool的優先級,因爲您不是唯一的消費者。我認爲合乎邏輯的方法是自己編寫自己的程序 - 或許像生產者/消費者隊列一樣簡單,使用自己的Thread(s)作爲消費者 - 自己設置線程優先級。

.NET 4.0包含新的庫(TPL等),使所有這些變得更加容易 - 在此之前,您需要額外的代碼來創建自定義線程池或工作隊列。

+0

訣竅是,我不想根據他們的優先級開始任務,我希望他們在他們的優先考慮下執行。 (也就是說,如果高優先級的任務應該暫停,如果高優先級的任務應該暫停) – Toto 2009-10-16 15:05:11

+0

注意:我正在使用3.5框架 – Toto 2009-10-16 15:06:29

+0

然後,你必須尋找「優先隊列C#」 - 有很多,但我可以' t直接推薦任何特定的一個。我*懷疑* TPL將在發佈時直接提供。 – 2009-10-16 15:18:04

2

當您在ThreadPool中使用構建時,所有線程都將使用默認優先級執行。如果你把這個設置搞亂了,它將被忽略。這是您應該推出自己的ThreadPool的情況。幾年前,我擴展了SmartThreadPool以滿足我的需求。這也可以讓你滿意。

0

我會創建一個暫掛任務對象的共享隊列,每個對象指定其優先級。然後編寫一個監視隊列的調度程序線程,併爲每個任務啓動一個新線程,達到某個最大線程數限制,並在創建它時指定線程優先級。它只有少量工作要做,並且可以讓調度程序報告活動,甚至可以動態調整正在運行的線程數。這個概念對我來說工作得非常好,如果你將你的隊列作爲一個數據庫表,那麼它可以被包裝在一個windows服務中。