我使用.net framework 4.0开发了一个.net应用程序,其中我使用了parallel.for()循环来实现多线程。我使用了以下配置:
我使用了ParallelOptions()类,并且此类的“MaxDegreeOfParallelism”属性设置为5.我在日志文件中记录了“Thread.CurrentThread.ManagedThreadId”,以检查是否在运行时创建了5个线程。我在两个不同的环境中测试了这个应用程序。当应用程序在开发它的环境中运行时,它会创建5个线程ID。但是当它在另一个环境中运行时,它会创建6个或7个线程ID。该应用程序仅在第一个环境中编译。我已经使用已发布的应用程序版本在第二环境中进行测试。 任何人都可以通过告知为什么会发生这种情况以及如何解决它来帮助我吗?
答案 0 :(得分:4)
Parallel.For
使用线程池线程。 MaxDegreeOfParallelism
控制正在使用的最大并发线程数,而不是5个特定线程 - 线程池可以自由处理其任何线程上的工作,并且Parallel.For
使确定只有5个同时运行。
答案 1 :(得分:2)
我认为这是因为Parallel.For()
仅使用 动态分区程序,因此可以在运行中对数组中传递进行分区,并且每个分区都由单独的任务/线程处理:
MSDN: How to: Implement Dynamic Partitions
每次分区都在枚举器上调用MoveNext,即枚举器 为分区提供一个列表元素。在PLINQ和 ForEach,分区是一个Task实例。因为请求是 在多个线程上同时发生,访问当前 索引是同步的。
(我相信Parallel.For()
)
PLINQ支持固定数量的分区(尽管数据可能是 在运行时加载动态重新分配给这些分区以进行加载 平衡)。 For和ForEach仅支持动态分区,其中 表示分区数在运行时更改。更多 信息,请参阅PLINQ和TPL的自定义分区程序。