Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程问题-如果线程池中没有可用线程,会发生什么情况?_C#_Multithreading - Fatal编程技术网

C# 线程问题-如果线程池中没有可用线程,会发生什么情况?

C# 线程问题-如果线程池中没有可用线程,会发生什么情况?,c#,multithreading,C#,Multithreading,我有以下代码: CancellationTokenSource cancelSource = new CancellationTokenSource(); _cancelTokenList.Add(cancelSource); CancellationToken token = cancelSource.Token; Task.Factory.StartNew(() => { StartTest(token); }, token); 如果没有线程可用于处理新任务的请求,是否会引

我有以下代码:

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

CancellationToken token = cancelSource.Token;

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

如果没有线程可用于处理新任务的请求,是否会引发异常,或者只是等待线程可用?如果它等待,它将等待多长时间?

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

来自MSDN:

在系统内存允许的情况下,您可以将任意多个线程池请求排队。如果请求多于线程池线程,那么在线程池线程可用之前,其他请求将保持排队状态

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


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

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


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

您一定很幸运。。触发速度比你自己的影子快。如果你在任务有机会开始之前取消任务,任务状态将从WaitingToRun直接变为Cancelled,并且任务永远不会启动。@Henk:我相信只有在任务已经启动的情况下才会这样。我认为如果它还没有调用用户代码,它可以通知并自行取消。不过我还没有测试过它。@Colin,@Jon,是的,因为令牌也被提供给这里的Startnew()。Randy,这个示例中的“令牌”是做什么的?@Henk-所以我可以在以后的某个时候取消任务,如果需要的话。是的。但与“可用线程”相关的要点是什么?