Parallel.ForEach期间使用的线程数

本文关键字:线程 ForEach Parallel | 更新日期: 2023-09-27 17:59:30

我刚刚做了一个简单的实验,用下面的代码来显示进程中的线程总数。

Console.WriteLine("Total Number of Threads: {0}", Process.GetCurrentProcess().Threads.Count);
Parallel.ForEach(
            names,
            new ParallelOptions  {MaxDegreeOfParallelism = Environment.ProcessorCount },
            name =>
            {
                Console.WriteLine(name);
            });
Console.Read();
Console.WriteLine("Total Number of Threads: {0}", Process.GetCurrentProcess().Threads.Count);

我在平行foreach之前有12个线程,在平行foreeach之后有17个线程。

问题:

  1. 为什么Parallel.Foreach中使用的5个线程在循环后继续运行?这是否意味着,如果我有其他Parallel.Foreach之后,会有更多的线程继续增加
  2. 为什么Parallel.Foreach以前不使用12个线程?是因为这12个线程目前正被其他人使用吗

Parallel.ForEach期间使用的线程数

从外部看,这种行为是不确定的。

Parallel类使用Threadpools。关于何时创建新线程以及何时使用旧线程,有一些决定。这也为您提供了性能,并减少了所需的内存量。

在并行foreach之后,一些线程可能(暂时)仍然存在,这些线程可以用于线程池活动。但据我所知,你无法预测,是否或有多少线程将继续存在。

我的理解也是,您无法预测将运行多少线程。我遇到过线程数量高于我所需数量的问题,我使用AutoResetEvent处理了这些问题。