2011-07-06 103 views
2

我正在處理一個處理並行運行的幾個任務的項目。TPL如何知道線程是否需要更多工作?

要處理的任務的數目通常爲〜200和那些的,可以是平行的爲約10

我使用TPL,因爲它簡化了很多的細節也因爲它提供了一種方法,以控制在考慮併發度與自定義TaskScheduler等。

但是,我也試圖找到一個很好的功能,讓我知道一個特定的線程要求更多的工作,並且ThreadPool的隊列是空的,並且它沒有任何其他線程。

可以這樣做嗎?

編輯1 我第一次不清楚。每次我只能將大約50個任務排隊到ThreadPool,並且我們不希望等待整個50個項目完成處理。

+0

你想用這些信息做什麼? –

+0

對不起,我不清楚我編輯了這個問題,以便它可能很清楚。 – logik6

+0

如果你打算自己做計劃,你爲什麼使用線程池? –

回答

3

不過,我也想找到一個不錯的功能,可以讓我知道某個特定線程要求更多的工作和線程池的隊列是空的,它沒有任何更多的工作,從偷其他線程。

不幸的是,ThreadPool的內部工作原理並未公開公開。沒有辦法掛鉤到這個特定的信息。

這就是說,ThreadPool作爲一個單一的內聚單元工作 - 當單個線程池線程啓動一個新的Task時,本地工作隊列真的很重要,因爲新任務被添加到該線程的本地工作隊列中。 「ThreadPool的隊列是空的,並且沒有任何工作要從其他線程中竊取」,只有當整個ThreadPool完成處理時纔會發生,如果你是添加工作的人,只要所有你的工作已經完成。這是很容易檢查...


編輯:

我不清楚第一次。每次我只能將大約50個任務排隊到ThreadPool,並且我們不希望等待整個50個項目完成處理。

如果您使用TPL,則可以將整個工作負載排隊。通過使用自定義的TaskScheduler(或者甚至是僅依賴於ThreadPool池的默認設置),您將自動獲取資源池,從而防止一次處理太多的工作項。隨着工作量的增加,更多的項目會自動計劃...

2

爲什麼不爲每項任務創建一個Task並全部啓動? TPL應該自動確定要一次安排到線程池的時間(它們不會同時運行並佔用所有資源 - 它會將若干任務安排到線程池中,然後按照更早的時間安排完成)。

相關問題