簡體   English   中英

對於長時間運行的進程,最好手動執行線程而不是線程池,這是真的嗎?

[英]Is it true that for long running processes it is better to do thread manually instead of threadpool?

前幾天我讀到,對於長時間運行的任務,我最好的辦法是手動創建線程,而不是使用 .NET 的線程池或任務並行。 當我正在學習 c# 線程時,我真的很想有人啟發我,特別是對於長時間運行的 IO 任務。 先感謝您。

那是真實的。 線程池針對小型工作單元進行了優化,您可以通過保留線程池線程來干擾其他工作。

我的經驗法則是,如果一個操作可能需要超過一秒鍾,它不應該在線程池線程上。 那可能很長。

盡管這是未記錄的,但如果您使用TaskCreationOptions.LongRunning啟動一個Task ,那么將啟動一個新線程來運行該任務。

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

與往常一樣,我建議閱讀Joe Albahari 的免費電子書,然后閱讀Joe Duffy 的 Concurrent Programming on Windows 后者有 1000 頁長,但充滿了有用的細節。

你是對的,ThreadPool 線程是輕量級和廉價的,因為可以重新調度以處理來自 ThreadPool 的新請求,所以一旦線程操作完成,ThreadPool 可以重新調度同一線程進行其他操作,您也可以通過最小線程數進行操作( ThreadPool.SetMinThreads() ),所以在新的請求到來之前,它們會一直存在。 因此,對於多個輕量級操作來說,這是一個很好的解決方案,例如您需要每隔幾秒鍾創建一個單獨的/新線程。

MSDN 雜志上非常好的文章: 專用線程還是線程池線程?

一旦達到最小線程數,線程池旨在將創建的線程數限制為每 500 毫秒一個。 這是一種智能機制,避免了在該時間段內可能釋放多個線程池線程時創建新線程的昂貴成本。

由於 .NET 4.0 - 任務並行庫是手動線程管理和同步的良好高級抽象和替代方案,因此您的代碼不太容易出錯。 因此,只需使用TaskCreationOptions.LongRunning創建一個任務,我相信從可維護性的角度來看,這將是對應用程序架構的最佳投資。

有用的閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM