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