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

时间:2011-05-25 12:56:29

标签: c# multithreading

我有以下代码:

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

CancellationToken token = cancelSource.Token;

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

如果没有线程可用于为新任务提供服务,是否会抛出异常,还是会等到线程可用?如果它等了,它会等多久?

3 个答案:

答案 0 :(得分:4)

来自MSDN:

  

您可以将系统内存允许的线程池请求排队。如果请求多于线程池线程,则其他请求将保持排队,直到线程池线程可用为止。

     

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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