我试图在 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?

最佳答案

线程池使用 complicated mechanism 来确定将运行的线程数。

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

关于c# - 为什么通过调用 Task.Run 和 ThreadPool.QueueUserWorkItem 排队到 ThreadPool 时线程数增加了不止一?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58878356/

10-12 00:24
查看更多