Goo*_*ide 11 c# ienumerable yield-return task-parallel-library parallel.foreach
请考虑以下代码示例,该示例创建一个可枚举的整数集合并并行处理它:
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
}
}
Run Code Online (Sandbox Code Playgroud)
是否保证Parallel.ForEach()每个生成的工作线程获得不同的项目,或者是一些围绕增量和返回i所需的锁定机制?
Ere*_*mez 12
Parallel.ForEach<TSource>,当TSource是一个时,为它IEnumerable<T>创建一个IEnumerable<T>包含其自己的内部锁定机制的分区器,因此您不需要在迭代器中实现任何线程安全性.
每当工作线程请求一大块项目时,分区器将创建一个内部枚举器,其中:
如您所见,IEnumerable<T>为了分区而运行是顺序的(通过共享锁访问),并且并行处理分区.
| 归档时间: |
|
| 查看次数: |
2071 次 |
| 最近记录: |