1

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

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);

我在parallel.foreach 之前有12 个线程,在parallel.foreach 之后有17 个线程。

问题:

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

2 回答 2

7

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

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

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

于 2013-02-14T07:23:36.750 回答
-2

我的理解也是,您无法预测将运行多少线程。我遇到了线程数高于我想要的线程数的问题,我使用 AutoResetEvent 进行了处理。

于 2021-09-10T19:09:51.320 回答