2009-09-21 61 views
0

我正在使用C#在Visual Studio 2008中處理我的第一個ThreadPool應用程序。清除線程池

我有一份報告,必須使用我們的SQL Server上的數據對2000到4000部件進行計算。

我正在排隊一個ThreadPool中的所有零件編號,它們在哪裏關閉並計算其結果。當這些線程完成後,RegisterWaitForSingleObject事件觸發取消註冊排隊項目的句柄。

所有排隊的項目完成後,有沒有辦法將它們從ThreadPool中刪除?

它的樣子,如果有人使用2000到4000部分的新組合來運行另一個報告,我無法刪除以前的部件數組。

我將如何刪除以前排隊的項目?用workerThreads = 0調用SetMaxThreads會做到嗎?

我意識到我可以嘗試,但是我可能會浪費本週大部分時間的試驗。

感謝您的時間,

回答

4

一旦ThreadPool項目完成後,它會自動從隊列中刪除。什麼向你表明他們不是?

+0

沒有表明他們不是......但同時,沒有任何跡象表明他們是!我無法找到任何說明進入隊列的舊項目被髮布的文檔。 感謝您的回答! Joe – jp2code

2

假設你的意思是中斷(取消)對當前隊列中的工作...

更改最大線程不會影響待審批工作;它只會改變可用線程的數量 - 這通常是一個壞主意(你的代碼不是唯一使用ThreadPool的東西)。我將使用自定義隊列 - 編寫基本(線程安全)的生產者/消費者隊列相當容易,或者.NET 4.0包含一些非常好的自定義線程隊列。

然後您可以放棄自定義隊列並啓動一個新隊列。

我寫了一個簡單的here;此時它希望在終止之前乾淨地退出(即排空隊列直到它爲空),但是在當前項目之後添加一個標誌以立即停止將很容易(不要中斷/中止線程執行中的任意點;從來不是一個好主意)。

+0

感謝Gravell先生的幫助。我會說我已經運行了GetMaxThreads(在workerThreads之外,在completionPortThreads之外),兩個值都加倍了,然後測試了通過調用ThreadPool.SetMaxThreads(workerThreads,completionPortThreads)來保存它們。只要父進程處於活動狀態,直到我重新啓動,或直到我再次用另一個值調用SetMaxThreads,該設置纔會保持活動狀態多久? – jp2code

+1

每個過程或直到你再次改變它,我懷疑。 –