我在前些天讀到,對於長時間運行的任務,我最好的選擇是手動創建線程,而不是使用.NET的線程池或Task Parallel。當我學習c#線程時,我真的很喜歡有人給我啓發,特別是對於長時間運行的IO任務。先謝謝你。確實,對於長時間運行的進程,最好是手動執行線程而不是線程池?
回答
你說得對,ThreadPool線程既輕便又便宜,因爲可以重新調度來爲ThreadPool提供新的請求,所以只要線程操作完成,ThreadPool就可以重新調度同一個線程進行其他操作,也可以操作通過最低線程數(ThreadPool.SetMinThreads()),所以那些將會一直活着直到新的請求到來。所以這對於多個輕量級操作來說是一個很好的解決方案,例如您需要每隔幾秒創建一個單獨的/新的線程。
在MSDN雜誌一篇非常好的文章:Dedicated thread or a Threadpool thread?
一旦達到的最小線程數,線程池的目的是 限制正在創建每500毫秒一個線程數。 這是一個智能機制,避免了在該時間段內發佈多個線程池線程時可能會創建新線程的昂貴成本 。
由於.NET 4.0 - 任務並行庫是一個很好的高級抽象和手動線程管理和同步的替代方案,因此您的代碼將不太容易出錯。所以只需create a Task與TaskCreationOptions.LongRunning,我相信這將是從維護角度來看應用架構中最好的投資。
有用的書:
非常感謝您的指導。 – user1193665 2012-04-26 07:55:30
這是事實。線程池針對小型工作單元進行了優化,您可以通過保持線程池線程來干涉其他工作。
我的經驗法則是,如果一個操作可能需要一秒以上,它不應該在線程池線程上。這可能相當長。
雖然這是沒有記錄的,但如果你用啓動Task
,那麼將啓動一個新的線程來運行任務。
對於大多數IO任務,您應該真正使用異步版本的框架方法。這些使用內核函數並且意味着你不會阻塞任何線程。
與往常一樣,我建議您閱讀Joe Albahari's free ebook, ,然後是Joe Duffy's Concurrent Programming on Windows。後者是1000頁長,但充滿了有用的細節。
我會使用的標準是線程是否需要花費任何重要的時間來「等待」發生的事情,或者執行另一個線程可能正在等待的某個特定操作。 – supercat 2013-04-30 21:01:09
- 1. 用於長時間運行的任務的線程池或TPL
- 2. 線程池執行程序
- 3. 實現Runnable時不同的行爲,而不是延長線程
- 4. 執行並行線程池
- 5. 線程池是否按順序運行?
- 6. Android中的線程處理長時間運行的進程
- 7. 在長時間運行的線程
- 8. Python:長時間運行後臺進程的spawn或線程?
- 9. 總是使用線程池線程進行異步連續
- 10. 當應用程序池仍在運行時,是否會終止長時間運行的線程
- 11. 線程池是否可以在單線程函數上運行?
- 12. 對於長時間運行的線程使用ThreadPool的缺點
- 13. 而線程執行
- 14. 正確使用JavaFX任務執行多線程和線程池
- 15. 試圖與tkinter(tkinter是在主線程上)運行線程執行任務,而是它停止主線程
- 16. 什麼是阻止線程池運行的好方法?
- 17. 線程池運行爲了
- 18. C++線程的執行時間和執行線程在另一個線程
- 19. 用於運行可執行文件的python多線程進程
- 20. 多線程實例訪問時是否是線程池線程安全?
- 21. 多線程執行時間最小化
- 22. 線程 - 執行時間
- 23. Python:線程執行時間
- 24. python多線程長線程運行
- 25. 執行多線程進程
- 26. C#線程:在不正確的對象上執行的線程
- 27. 線程池執行程序接受customqueue
- 28. 線程池最大線程
- 29. 執行程序創建的線程池是否釋放內存?
- 30. C++線程運行時間
查看此問題:http://stackoverflow.com/questions/230003/thread-vs-threadpool – 2012-04-24 13:20:34