问题描述
|
我有以下代码:
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()将被执行。