C# 为什么通过调用Task.Run和ThreadPool.QueueUserWorkItem将线程数增加一个以上?

C# 为什么通过调用Task.Run和ThreadPool.QueueUserWorkItem将线程数增加一个以上?,c#,.net,task-parallel-library,threadpool,C#,.net,Task Parallel Library,Threadpool,我试图通过线程的帮助来计算控制台应用程序中的运行线程数: new Thread(() => { while (true) { Thread.Sleep(500); Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Threads.Count); }

我试图通过
线程的帮助来计算控制台应用程序中的运行线程数:

new Thread(() =>
        {
            while (true)
            {
                Thread.Sleep(500);
                Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Threads.Count);
            }
        }).Start();
在那之后,我开始了新的
线程
,它包含了非常简单的执行逻辑。在没有任何意外的情况下,线程数增加了
1
。对于
ThreadPool.QueueUserWorkItem
它增加了3

并对
任务进行了相同的测试。运行(()=>{…})
。令人惊讶的是,线程数增加了
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?

线程池使用a来确定将运行多少线程


当您通过调用
QueueUserItem
或创建
Task
将工作排入线程池时,线程池将使用默认的初始线程数初始化,通常为四个

@Fredou为了获得计数,我在问题的第一行中与您分享了一条专用的线索使用
Task
Task
的一个要点是关注手头的工作,而不是机制。为什么你如此关心运行时在任何特定时间运行的线程数?@Damien_the_unsiver我在比较两个不同实现的运行线程数。因为,运行线程越少,上下文切换就越少,等等。也无法找出为什么计数会增加这么多。然后,我编写了简单的代码来找出差异。我觉得它在某个地方有文档记录,但我没有找到它的任何运气注意,仅仅因为一个线程出现在
GetCurrentProcess().Threads
,并不意味着它正在运行。这可能是一个线程池,它什么也没做。@canton7我们在同一条路上。我会等一会儿,然后可能会删除答案。我想这可能是因为我忽略了一些细节。你能分享一下关于线程池中默认初始线程数的文档吗?@FarhadJabiyev你可以调用该方法来获取这些值,尽管文档上说:当需求较低时,线程池线程的实际数量可能低于最小值。在我的电脑中有4个(和4个I/O完成线程)。@Nick谢谢你的回答。它克服了我的困惑。我也会试着读那篇文章。