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个线程。
问题:
- 为什么Parallel.Foreach中使用的5个线程在循环后继续运行?这是否意味着,如果我有其他Parallel.Foreach之后,会有更多的线程继续增加
- 为什么Parallel.Foreach以前不使用12个线程?是因为这12个线程目前正被其他人使用吗
从外部看,这种行为是不确定的。
Parallel类使用Threadpools。关于何时创建新线程以及何时使用旧线程,有一些决定。这也为您提供了性能,并减少了所需的内存量。
在并行foreach之后,一些线程可能(暂时)仍然存在,这些线程可以用于线程池活动。但据我所知,你无法预测,是否或有多少线程将继续存在。
我的理解也是,您无法预测将运行多少线程。我遇到过线程数量高于我所需数量的问题,我使用AutoResetEvent处理了这些问题。