Task.Run(Action) 是否启动了一个新的 Thread 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,我的问题是(如磁贴状态),Task.Run 会启动如果 ThreadPool 中有 none 可用,则创建一个新线程?还是等到有可用的时候?

[tl;dr] 我目前正在排队一些直接到 ThreadPool 的调用:

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

但是,我注意到在某些负载下,应用程序确实 运行 超出了池中的线程(Parallel.ForEach 有问题,在程序的其他地方)。

我知道增加池中的线程数可能不会解决任何问题,所以我正在考虑使用 MaxDegreeOfParallelism (ParallelOptions) 来控制 Parallel.Foreach 使用的线程数。

无论如何,我还是很想知道上述问题的答案。

谢谢=]

would Task.Run start a new Thread if there are none available in the ThreadPool?

不是马上。任务将排队。

但是 ThreadPool 确实管理它的线程:当队列填满时,它将以每秒 2 个的速率创建新的工作线程。

并且当队列运行为空时,线程将以相同的速率被销毁。

实际算法稍微复杂一些(从 .NET 4 开始),但这确实意味着 Pool 确实执行了一些相对简单的资源管理。