![](/img/trans.png)
[英]Stop Threads created with ThreadPool.QueueUserWorkItem that have a specific task
[英]Why threads count is increased by more than one when queuing to ThreadPool by calling Task.Run and ThreadPool.QueueUserWorkItem?
我试图在该Thread
的帮助下计算控制台应用程序中正在运行的线程数:
new Thread(() =>
{
while (true)
{
Thread.Sleep(500);
Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Threads.Count);
}
}).Start();
之后我开始了新的Thread
,其中包含非常简单的执行逻辑。 毫无疑问,线程数增加了1
。 对于ThreadPool.QueueUserWorkItem
,它增加了 3。
并对Task.Run(() => {...})
做了同样的测试。 令人惊讶的是,线程数增加了4
或有时5
。 不幸的是,我无法理解原因。
以下是测试的完整代码:
static void Main(string[] args)
{
new Thread(() =>
{
while (true)
{
Thread.Sleep(500);
Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Threads.Count);
}
}).Start();
//Task.Run(() =>
//{
// Thread.Sleep(5000);
//}); // thread count is 12
//new TaskFactory().StartNew(() =>
//{
// Thread.Sleep(5000);
//}); // thread count is 12
//ThreadPool.QueueUserWorkItem((onj) =>
//{
// Thread.Sleep(5000);
//}); // thread count is 9
//new Thread(() =>
//{
// Thread.Sleep(5000);
//}).Start(); // thread count is 7
Console.ReadLine();
}
我的问题是,为什么运行新任务会使线程数增加 4 或 5? 为什么为线程池排队工作项会使线程数增加 3?
线程池采用一种复杂的机制来确定将运行多少线程。
当您通过调用QueueUserItem
或创建Task
将工作排队到线程池时,线程池将使用默认的初始线程数进行初始化,通常为四个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.