繁体   English   中英

线程问题 - 如果线程池中没有可用的线程会发生什么?

[英]Threading Question - What happens if no threads available in the thread pool?

我有以下代码:

CancellationTokenSource cancelSource = new CancellationTokenSource();
_cancelTokenList.Add(cancelSource);

CancellationToken token = cancelSource.Token;

Task.Factory.StartNew(() =>
{
   StartTest(token);
}, token);

如果没有线程可用于为新任务的请求提供服务,是否会抛出异常,还是会等待线程可用? 如果要等,要等多久?

来自 MSDN:

您可以对系统 memory 允许的尽可能多的线程池请求进行排队。 如果请求多于线程池线程,则其他请求保持排队,直到线程池线程可用。

托管线程池中的线程是后台线程。 也就是说,它们的 IsBackground 属性为真。 这意味着 ThreadPool 线程不会在所有前台线程都退出后保持应用程序运行。

它会一直等到有一个可用,或者您的应用程序退出。

它只会等到一个线程可用。 据我所知,只要获得线程,它就会等待。 如果你在它还在等待线程的时候取消它,它会立即被取消,并且用户代码永远不会运行。

一个任务被交给一个调度器。 (默认)TPL 调度程序管理少数工作线程并将任务分配给这些线程。 如果没有可用的线程,您的任务将在队列中等待。 如果排队的任务太多,调度程序/线程池将慢慢创建新线程(以 2 个/秒的速度)。

您显示但未提及 CancellationToken。 它只能用于请求取消 ,所以我怀疑您的 StartTest() 将被执行,即使在任务排队时令牌被取消

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM