2012-04-24 70 views
13

我在前些天讀到,對於長時間運行的任務,我最好的選擇是手動創建線程,而不是使用.NET的線程池或Task Parallel。當我學習c#線程時,我真的很喜歡有人給我啓發,特別是對於長時間運行的IO任務。先謝謝你。確實,對於長時間運行的進程,最好是手動執行線程而不是線程池?

+1

查看此問題:http://stackoverflow.com/questions/230003/thread-vs-threadpool – 2012-04-24 13:20:34

回答

7

你說得對,ThreadPool線程既輕便又便宜,因爲可以重新調度來爲ThreadPool提供新的請求,所以只要線程操作完成,ThreadPool就可以重新調度同一個線程進行其他操作,也可以操作通過最低線程數(ThreadPool.SetMinThreads()),所以那些將會一直活着直到新的請求到來。所以這對於多個輕量級操作來說是一個很好的解決方案,例如您需要每隔幾秒創建一個單獨的/新的線程。

在MSDN雜誌一篇非常好的文章:Dedicated thread or a Threadpool thread?

一旦達到的最小線程數,線程池的目的是 限制正在創建每500毫秒一個線程數。 這是一個智能機制,避免了在該時間段內發佈多個線程池線程時可能會創建新線程的昂貴成本 。

由於.NET 4.0 - 任務並行庫是一個很好的高級抽象和手動線程管理和同步的替代方案,因此您的代碼將不太容易出錯。所以只需create a TaskTaskCreationOptions.LongRunning,我相信這將是從維護角度來看應用架構中最好的投資。

有用的書:

+0

非常感謝您的指導。 – user1193665 2012-04-26 07:55:30

14

這是事實。線程池針對小型工作單元進行了優化,您可以通過保持線程池線程來干涉其他工作。

我的經驗法則是,如果一個操作可能需要一秒以上,它不應該在線程池線程上。這可能相當長。

雖然這是沒有記錄的,但如果你用​​啓動Task,那麼將啓動一個新的線程來運行任務。

對於大多數IO任務,您應該真正使用異步版本的框架方法。這些使用內核函數並且意味着你不會阻塞任何線程。

與往常一樣,我建議您閱讀Joe Albahari's free ebook, ,然後是Joe Duffy's Concurrent Programming on Windows。後者是1000頁長,但充滿了有用的細節。

+0

我會使用的標準是線程是否需要花費任何重要的時間來「等待」發生的事情,或者執行另一個線程可能正在等待的某個特定操作。 – supercat 2013-04-30 21:01:09