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-所以我可以在以后的某个时候取消任务,如果需要的话。是的。但与“可用线程”相关的要点是什么?