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

本文关键字:线程 什么 问题 如果 | 更新日期: 2023-09-27 17:57:34

我有以下代码:

CancellationTokenSource cancelSource = new CancellationTokenSource();
_cancelTokenList.Add(cancelSource);
CancellationToken token = cancelSource.Token;
Task.Factory.StartNew(() =>
{
   StartTest(token);
}, token);

如果没有线程可用于为新任务的请求提供服务,会引发异常吗?还是只等待线程可用?如果它等待,它将等待多久?

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

来自MSDN:

在系统内存允许的情况下,您可以对尽可能多的线程池请求进行排队。如果请求数超过线程池线程数,则在线程池线程可用之前,其他请求将一直排队。

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

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

它只会等待线程可用。据我所知,只要得到一个线程,它就会等待很长时间。如果您在它仍在等待线程时取消它,它就会立即被取消,用户代码将永远不会运行。

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

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