[英]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();
我對此幾乎沒有疑問:
我已經閱讀了一些文檔,但我沒有找到具體的解釋。 例如, 任務文檔通常說的是任務:
因為Task對象執行的工作通常在線程池線程上異步執行,而不是在主應用程序線程上同步執行...
它總是在ThreadPool線程上運行嗎?
不必要。 如果你看一下使用TaskCreationOptions
的Task
構造函數重載 ,你可以傳遞值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.