簡體   English   中英

將任務和線程池一起使用是否可以?

[英]Is it fine to use tasks and thread-pool together?

讀線程池和任務是如何工作后, 這個文章中,我提出了這個問題-

如果我有一個復雜的程序,其中一些模塊使用tasks ,一些使用thread pool ,是否可能由於不同的用途會有一些調度問題?

任務通常使用線程池實現(當然也可以使用其他類型的調度程序來執行任務,這些調度程序提供不同的行為,但這是默認設置)。 就正在執行的實際代碼而言(假設您的任務代表正在運行的代理),確實沒有太大區別。

任務只是圍繞該線程池調用創建一個包裝器,以便在收集有關該異步操作的信息和處理該異步操作的結果時提供其他功能。 如果您想利用其他功能,請使用任務。 如果您不需要在某些特定上下文中使用它,則直接使用線程池沒有任何問題。

混合兩者,只要你沒有從這些操作的結果中得到你想要的東西,根本不是問題。

不,不會有問題 - 你只會做兩者效率低下。 使用真正需要的東西並堅持使用模式。 請記住確保您的應用程序MT安全,特別是如果您從不同的線程訪問相同的資源/變量等,無論您使用哪種線程算法。

不會。混合方法實際上並沒有太多記憶或性能低效的方法; 默認情況下,任務使用線程池線程使用的相同線程池。

混合兩者的唯一顯着缺點是代碼庫缺乏一致性。 如果你選擇一個,我會使用TPL,因為它有一個豐富的API來處理多線程的許多方面,並利用async / await語言功能。

由於您的使用是按模塊行划分的,因此您不必擔心。

不應該有任何調度問題,但當然最好使用Tasks並讓Framework決定如何處理預定的工作。 在當前版本的框架(4.5)中,除非使用LongRunning選項,否則工作將通過ThreadPool排隊,但此行為可能在將來發生變化。

結論:混合任務和ThreadPool不是問題,但對於新應用程序,建議使用Tasks而不是直接在ThreadPool上排隊工作項(原因之一是ThreadPool在Windows 8運行時(現代UI應用程序)中不可用) 。

暫無
暫無

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

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