簡體   English   中英

Task.Run(Action)是否啟動新的線程ID,所以ThreadPool中沒有更多線程了嗎?

[英]Does Task.Run(Action) Start a new Thread id there are no more threads in the ThreadPool?

根據msdn的說法,Task.Run(Action)在ThreadPool中使用線程來實際執行Action,我的問題是(作為平鋪狀態),如果ThreadPool中沒有可用的Task.Run是否將啟動一個新線程? 還是只是等到有一種可用?

[tl; dr]我當前正在將一些調用直接排隊到ThreadPool:

ThreadPool.QueueUserWorkItem(x => ...);

但是,我注意到在某些負載下,應用程序確實會耗盡池中的線程(Parallel.ForEach在程序的其他地方出錯)。

我知道增加池中的線程數可能無法解決任何問題,因此我在考慮使用MaxDegreeOfParallelism(ParallelOptions)來控制Parallel.Foreach使用的線程數。

無論如何,我仍然想知道上述問題的答案。

謝謝=]

如果ThreadPool中沒有可用的Task.Run將啟動一個新線程?

不是立即。 該任務將排隊。

但是ThreadPool確實管理其線程:當隊列填滿時,它將以每秒2的速率創建新的工作線程。

並且當隊列運行時,空線程將以相同的速度銷毀。

實際的算法要復雜得多(從.NET 4開始),但這確實意味着Pool確實執行了一些相對簡單的資源管理。

暫無
暫無

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

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