2011-04-17 61 views
1

C#4.0的新BlockingCollection沒有回答一個簡單的要求,我們需要:
*併發隊列的任務物品。
*消費者 - 一次有限的N個線程 - 從線程池(線程不專用於此隊列,並且在隊列中沒有項目時不會被阻止)。 對於資源使用特別有用,我們需要一次只限制一個(N = 1)線程,並且隊列可以不時排空。C#4.0和排隊有限的非專用線程池線程消費者

SmartThreadPool有一個很好的實現了這一目的,使用線程組的1

我一直在尋找新的C#4.0平行的lib一個很好的解決方案,充分利用了淨內部線程池的大小。 我可以想出一些解決方案,但我不知道是否有優雅的東西,我錯過了。

您認爲如何?

問候, 施洛米

回答

0

如果有人對建議的解決方案感興趣,請在msdn論壇中查看以下主題: msdn parallel computing forums question

這是我問與上述相關的問題,Stephen Toub給了我一個滿意的答案。

Shlomi

0

任務的線程池不應該阻止。雖然在.NET 4.0中已經完成了工作來支持它,但是Threadpool並不適用於長時間運行的任務,當然也不適用於阻止操作(經驗法則,如果線程啓動時間對於所需時間可以忽略不計那麼這個任務對你來說最好是啓動你自己的線程)。

對於聽起來像你想要做的事情你可能會更好IObservable的東西。看看Rx(反應式)擴展,您可以使用IObservable完成一些非常酷的事情。默認情況下,IObservable一次只能處理一個請求,但你可以很容易地將每個對象發送給你,並將它扔到線程池(用於實際處理)和/或使用TPL。具有最大並行性的TaskScheduler可能會幫助您。

我想不出任何可以做你想找的東西。您可能想要將ConcurrentQueueEventWaitHandle以及您可以控制的一些工作線程配對。

+0

嗨Talljoe,謝謝你的回覆!這些任務並不意味着長時間運行,儘管他們一次只能完成一項任務的限制。因此,使用線程池仍然相關。 Rx擴展是一個有趣的想法,我計劃檢查它(tnx!)。除此之外,您建議的解決方案與我想象並可能實施的類似。 – shlomiw 2011-04-17 11:37:28

+0

我的錯誤,我認爲消費者是在BlockingCollection上阻塞的線程池任務。 – Talljoe 2011-04-17 11:40:55