2011-02-17 38 views
5

我創建了大量的Task實例。我需要全部運行它們,並等待它們全部完成。問題是我需要確保在任何給定的時間內,「開始」和「完成」之間不超過X個任務;這些任務涉及對併發呼叫數量有限制的其他方的呼叫。由於這些限制不是基於我的硬件,我不能依賴任何內置的智能節流;我需要嚴格執行限制。我已經能夠通過讓任務以線程安全的方式遞增和遞減共享變量來實現這一點,但似乎不必要的繁瑣。有沒有更直接內置於API的方式,還是我缺少的簡單同步工具?什麼是限制多個.NET任務實例的最佳方式?

+1

信號量對我來說聽起來很不錯。 – 2011-02-17 21:32:29

回答

4

你必須創建自己的任務調度程序,請參見How to: Create a Task Scheduler That Limits the Degree of Concurrency

編輯:這需要更多的代碼比信號,但我有一種感覺,這可能會表現得更好,因爲線程池,其中將任務執行不知道你的信號量,但是使用TaskScheduler正在按照他們的規則玩。

編輯2:一個使用旗語的可能的缺點之一是,線程池可能會認爲你的任務是做IO操作,並在時間安排他們很多(讓他們掛在那裏等待,因爲他們不」 t需要CPU)。使用TaskScheduler,他們將在他們有位置時準確安排。它肯定會讓游泳池更清潔。

1

旗語類可能爲你工作:http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

有這個MSDN網頁上一個很好的例子向您展示如何使用它。

可能還有更輕量的內置線程池/同步機制可用於完成相同的目標,但Semaphore基本上可以滿足您的要求。

+1

如果說.net 4.0和Semaphore我建議看看SemaphoreSlim:http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx – Andrey 2011-02-17 21:36:21

相關問題