2010-12-10 37 views
6

我使用線程池如何確定項目的數量,線程池隊列

While(reading in data for processing) 
{ 
    args = some data that has been read; 
    ThreadPool.QueueUserWorkItem(new WaitCallback(threadRunner), args); 
} 

這是工作得非常好排隊工作項的1000年代,然而,主線程排隊的請求比他們快處理後的內存慢慢吃光了。

我願做以下節流排隊一個類似於作爲該隊列增長

Thread.Sleep(numberOfItemsCurrentlyQueued); 

這將導致更長時間的等待的隊列增長。

有什麼方法可以發現隊列中有多少物品?

回答

2

我不認爲有一個內置的方式,但你可以引入一個[靜態?]計數器,可以增加/減少;爲此,您將不得不創建自己的方法來包裝ThreadPool.QueueUserWorkItem()並處理計數器。

順便說一句,如果你正在運行.NET 4.0,你應該使用TaskFactory.StartNew而不是ThreadPool.QueueUserWorkItem() - 據說它有更好的內存/線程管理。

4

生產者/消費者隊列的更易於管理的抽象是BlockingCollection<T>。這裏的示例代碼顯示瞭如何使用Tasks來排序和排空隊列。隊列計數通過Count屬性隨時可用。

如果可以,請避免使用Sleep延遲更多商品的生產。當隊列變得太大時,讓製片人等待一個事件或類似事件,當隊列積壓達到一個可讓你製作更多項目的舒適閾值時讓消費者發出事件信號。總是試圖讓事情發生變化 - Sleep是有點猜測。

+0

我接受了Andrey給出的答案,他回答了問題標題「我如何確定ThreadPool隊列中的項目數?」但是,您的答案對我來說最有用,謝謝您分享此解決方案。 – Perrin255 2010-12-13 09:21:13

+0

很高興這是有幫助的。祝你好運。 – 2010-12-13 17:33:38