gpt4 book ai didi

c# - 为什么通过调用 Task.Run 和 ThreadPool.QueueUserWorkItem 排队到 ThreadPool 时,线程数会增加一个以上?

转载 作者:行者123 更新时间:2023-11-30 12:19:23 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com