我有以下代码:
CancellationTokenSource cancelSource = new CancellationTokenSource();
_cancelTokenList.Add(cancelSource);
CancellationToken token = cancelSource.Token;
Task.Factory.StartNew(() =>
{
StartTest(token);
}, token);
如果没有线程可用于为新任务提供服务,是否会抛出异常,还是会等到线程可用?如果它等了,它会等多久?
答案 0 :(得分:4)
来自MSDN:
您可以将系统内存允许的线程池请求排队。如果请求多于线程池线程,则其他请求将保持排队,直到线程池线程可用为止。
托管线程池中的线程是后台线程。也就是说,它们的IsBackground属性是真的。这意味着在所有前台线程退出后,ThreadPool线程不会使应用程序继续运行。
它将一直等待,或者您的应用程序退出。
答案 1 :(得分:2)
它将等待一个线程可用。据我所知,只要获得一个线程,它就会等待。如果你在等待线程时取消它,它会立即被取消,用户代码永远不会运行。
答案 2 :(得分:2)
将任务交给调度程序。 (默认)TPL调度程序管理少数工作线程并将任务分配给这些线程。如果没有线程可用,您的任务将在队列中等待。如果太多任务正在排队,则调度程序/线程池将慢慢创建新线程(速率为2 /秒)。
您显示但未提及CancellationToken。它只能用于请求取消所以我怀疑你的StartTest()将被执行,即使在任务排队时取消了令牌。