考虑以下代码示例,它创建一个可枚举的整数集合并并行处理它:
using System.Collections.Generic;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
Parallel.ForEach(CreateItems(100), item => ProcessItem(item));
}
private static IEnumerable<int> CreateItems(int count)
{
for (int i = 0; i < count; i++)
{
yield return i;
}
}
private static void ProcessItem(int item)
{
// Do something
}
}
是否保证生成的工作线程Parallel.ForEach()
每个都获得不同的项目,或者是围绕增量和返回的某种锁定机制i
必需的?
Parallel.ForEach<TSource>
, when TSource
is an IEnumerable<T>
,创建一个分区器IEnumerable<T>
其中包括它自己的内部锁定机构,因此您不需要在迭代器中实现任何线程安全。
每当工作线程请求一块项目时,分区器就会创建一个内部枚举器, which:
- 获取共享锁
- 迭代源(从剩下的位置)以检索项目块,将项目保存在私有数组中
- 释放锁,以便可以满足其他块请求。
- 从其私有数组为工作线程提供服务。
如您所见,运行通过IEnumerable<T>
出于分区目的,分区是顺序的(通过共享锁访问),并且分区是并行处理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)