簡體   English   中英

新的Task總是在ThreadPool線程上執行嗎?

[英]Is new Task always executed on ThreadPool thread?

這可能是一個簡單而愚蠢的問題。 我創建了這樣一個任務:

Task<bool> myTask = new Task<bool>(() => { Debug.WriteLine("Task fired"); return true; });
// I know I can create it with Task.Run, but this is for purpose of the sample
myTask.Start(); 

我對此幾乎沒有疑問:

  • 它總是在ThreadPool線程上運行嗎?
  • 如果它在ThreadPool上運行,它有可能由UI線程運行嗎? 如果有工作 - 可以阻止它嗎?
  • 如果有大量任務,很少可以分配給一個線程(排隊),然后一個接一個地運行? 或者每個任務都有自己的線程?

我已經閱讀了一些文檔,但我沒有找到具體的解釋。 例如, 任務文檔通常說的是任務:

因為Task對象執行的工作通常在線程池線程上異步執行,而不是在主應用程序線程上同步執行...

它總是在ThreadPool線程上運行嗎?

不必要。 如果你看一下使用TaskCreationOptionsTask構造函數重載 ,你可以傳遞值TaskCreationOptions.LongRunning 如果在內部它使用TaskScheduler.Default ,這將創建一個新線程,它不是線程池之一。

通常,建議您使用Task.Run對線程池上的線程進行排隊。 如果你想傳遞一個自定義的TaskScheduler ,你可以使用更高級的Task.Factory.StartNew ,但我建議只在真正需要時使用它。

如果它在ThreadPool上運行是否有可能由UI線程運行? 如果有工作 - 可以阻止它嗎?

不會.UI線程不是ThreadPool使用的池的一部分。

在大量任務的情況下,很少可以分配給一個線程(排隊),然后一個接一個地運行? 或者每個任務都有自己的線程?

這是特定於正在使用的TaskScheduler實現。 如果我們查看ThreadPoolTaskScheduler (在沒有傳遞自定義的情況下是默認值),則ThreadPoolTaskScheduler以一定量的線程開始,並根據需要進行擴展。 不保證每個代理將在不同的線程上執行。 但是,您可以創建自定義TaskScheduler ,您可以在其中控制為exectuion安排任務的機制。

回答第一點:“從.NET Framework 4開始,使用線程池的最簡單方法是使用任務並行庫(TPL)。 默認情況下 [強調添加],並行庫類型如Task和Task使用線程池線程來運行任務。“

https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx

暫無
暫無

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

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