顺序迭代(Parallel.For())
本文关键字:迭代 For Parallel 顺序 | 更新日期: 2023-09-27 18:12:10
这段代码每次的输出都不一样。是否有可能从0到21连续输出i(迭代计数)?
static void Main(string[] args)
{
int N = 1000;
Parallel.For(0, N, (i, loop) =>
{
Console.WriteLine(i);
if (i == 21)
{
loop.Break();
}
});
Console.ReadLine();
}
当并行。对于使用的方法,不能保证特定的执行顺序。这样做的好处是,在有可用内核的计算机上,循环完成得更快,因为这些步骤通常是同时并行进行的。您仍然可以保证所有循环的迭代将在循环结束时运行,但不能保证它们的顺序。如果您想运行一个顺序循环,那么您应该使用for
.
样本与指数
foreach (var obj in Enumerable.Range(0, 10)
.Select((s, i) => new {index = i, value = s})
.AsParallel()
.Select(obj => new {obj.index, value = obj.value*obj.value, thread=Thread.CurrentThread.ManagedThreadId})
.OrderBy(o => o.index))
{
Console.WriteLine("{0}:{1} on {2}", obj.index, obj.value, obj.thread);
}
来自Core i7的结果。
0:0 on 1
1:1 on 3
2:4 on 5
3:9 on 1
4:16 on 1
5:25 on 1
6:36 on 1
7:49 on 1
8:64 on 1
9:81 on 1
带有内置索引的示例
foreach (var obj in Enumerable.Range(0, 10)
.AsParallel()
.AsOrdered()
.Select((idx,val) => new {idx, value = val*val, thread=Thread.CurrentThread.ManagedThreadId})
)
{
Console.WriteLine("{0}:{1} on thread {2}", obj.idx, obj.value, obj.thread);
}