顺序迭代(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();
    }

顺序迭代(Parallel.For())

当并行。对于使用的方法,不能保证特定的执行顺序。这样做的好处是,在有可用内核的计算机上,循环完成得更快,因为这些步骤通常是同时并行进行的。您仍然可以保证所有循环的迭代将在循环结束时运行,但不能保证它们的顺序。如果您想运行一个顺序循环,那么您应该使用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);
}