![](/img/trans.png)
[英]What type/types of threading should I use in WPF and c# for my scenario… regular threads, background worker, or thread pool?
[英]Threading Question - What happens if no threads available in the thread pool?
我有以下代码:
CancellationTokenSource cancelSource = new CancellationTokenSource();
_cancelTokenList.Add(cancelSource);
CancellationToken token = cancelSource.Token;
Task.Factory.StartNew(() =>
{
StartTest(token);
}, token);
如果没有线程可用于为新任务的请求提供服务,是否会抛出异常,还是会等待线程可用? 如果要等,要等多久?
来自 MSDN:
您可以对系统 memory 允许的尽可能多的线程池请求进行排队。 如果请求多于线程池线程,则其他请求保持排队,直到线程池线程可用。
托管线程池中的线程是后台线程。 也就是说,它们的 IsBackground 属性为真。 这意味着 ThreadPool 线程不会在所有前台线程都退出后保持应用程序运行。
它会一直等到有一个可用,或者您的应用程序退出。
它只会等到一个线程可用。 据我所知,只要获得线程,它就会等待。 如果你在它还在等待线程的时候取消它,它会立即被取消,并且用户代码永远不会运行。
一个任务被交给一个调度器。 (默认)TPL 调度程序管理少数工作线程并将任务分配给这些线程。 如果没有可用的线程,您的任务将在队列中等待。 如果排队的任务太多,调度程序/线程池将慢慢创建新线程(以 2 个/秒的速度)。
您显示但未提及 CancellationToken。 它只能用于请求取消
,所以我怀疑您的 StartTest() 将被执行,即使在任务排队时令牌被取消
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.