【发布时间】:2015-12-19 21:35:28
【问题描述】:
我知道如何编写 Parallel.For 和 Parallel.ForEach 循环。以下是它们的示例代码:
Parallel.For(0,10, (int i) = >
{
Console.Writeline(i);
});
Parallel.ForEach(fruits, fruit =>
{
Console.WriteLine("Fruit Name: {0}, Thread Id= {1}", fruit, Thread.CurrentThread.ManagedThreadId);
});
但是这两个代码示例的问题是循环不按顺序执行。如何让它们按顺序执行?我从人们那里听说你必须锁定一个对象,然后才有可能。我已经尝试搜索并尝试了很多代码示例但没有用。
此外,我想知道按顺序执行的并行循环的性能是否会降低?如果没有,为什么没有?因为锁定,会导致我拙见的延迟。
就我对并行编程的理解而言,调度程序在运行时进行调度。谁能说出 .NET IDE 使用什么算法/策略在多个内核上调度代码?其货到里外并行编程。
【问题讨论】:
-
它们将按顺序执行,首先是 For,然后是 ForEach。但不保证它们在自己作用域内的结果是按顺序排列的。
-
如果要顺序执行,请使用
for和foreach,集合排序的任何先决条件都会降低在Parallel中运行时的性能,甚至可能比顺序循环慢