繁体   English   中英

为什么通过调用Task.Run和ThreadPool.QueueUserWorkItem排队到ThreadPool时线程数增加了不止一个?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM