我創建了大量的Task實例。我需要全部運行它們,並等待它們全部完成。問題是我需要確保在任何給定的時間內,「開始」和「完成」之間不超過X個任務;這些任務涉及對併發呼叫數量有限制的其他方的呼叫。由於這些限制不是基於我的硬件,我不能依賴任何內置的智能節流;我需要嚴格執行限制。我已經能夠通過讓任務以線程安全的方式遞增和遞減共享變量來實現這一點,但似乎不必要的繁瑣。有沒有更直接內置於API的方式,還是我缺少的簡單同步工具?什麼是限制多個.NET任務實例的最佳方式?
回答
你必須創建自己的任務調度程序,請參見How to: Create a Task Scheduler That Limits the Degree of Concurrency
編輯:這需要更多的代碼比信號,但我有一種感覺,這可能會表現得更好,因爲線程池,其中將任務執行不知道你的信號量,但是使用TaskScheduler正在按照他們的規則玩。
編輯2:一個使用旗語的可能的缺點之一是,線程池可能會認爲你的任務是做IO操作,並在時間安排他們很多(讓他們掛在那裏等待,因爲他們不」 t需要CPU)。使用TaskScheduler,他們將在他們有位置時準確安排。它肯定會讓游泳池更清潔。
旗語類可能爲你工作:http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx
有這個MSDN網頁上一個很好的例子向您展示如何使用它。
可能還有更輕量的內置線程池/同步機制可用於完成相同的目標,但Semaphore基本上可以滿足您的要求。
如果說.net 4.0和Semaphore我建議看看SemaphoreSlim:http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx – Andrey 2011-02-17 21:36:21
- 1. OwlCarousel2初始化多個實例的最佳方式是什麼
- 2. 實例化許多JavaScript對象的最佳方式是什麼?
- 3. 執行多個併發任務的最佳方法是什麼?
- 4. 在實例中覆蓋方法的最佳方式是什麼?
- 5. 實現多個spinners的最佳方式是什麼?
- 6. 跨多個對象共享對象實例的最佳方式是什麼?
- 7. 在.net中製作單實例應用程序的最佳方法是什麼?
- 8. 回滾.net事務的最佳方式是什麼?
- 9. 多個團隊處理相同任務的最佳方式是什麼
- 10. 實現並行無限循環的最佳方式是什麼?
- 11. 在C#.NET中製作遊戲的最佳方式是什麼?
- 12. 返回完成的任務的最佳方式是什麼?
- 13. 序列化EMF模型實例的最佳方式是什麼?
- 14. 什麼是使用Observable「限制」消費的最佳方式?
- 15. 限制訪問開發網站的最佳方式是什麼?
- 16. 限制訪問Laravel的最佳方式是什麼?
- 17. 什麼是限制我們網站投票的最佳方式?
- 18. 什麼是限制IP地址的最佳方式?
- 19. 限制IP地址訪問的最佳方式是什麼?
- 20. 什麼是設置未知代碼限制的最佳方式?
- 21. 什麼是.NET DataTable最佳用例?
- 22. 在android中調度任務的最佳方式是什麼?
- 23. 在任務中捕獲異常的最佳方式是什麼?
- 24. 每秒執行一次任務的最佳方式是什麼?
- 25. 在寶石中安排任務的最佳方式是什麼?
- 26. 最佳實踐 - 什麼是觀看目錄的最佳方式
- 27. 在C#.NET中繪製實時頻譜的最佳方式是什麼?
- 28. 爲Web請求實現速率限制算法的最佳方式是什麼?
- 29. 什麼是實現web服務登錄的最佳方式?
- 30. 在服務器中實現AutoComplete的最佳方式是什麼?
信號量對我來說聽起來很不錯。 – 2011-02-17 21:32:29