Когда мы используем foreach
и Tasks
мы должны использовать локальные переменные, как это:Parallel.ForEach против Foreach и задачи в локальной переменной
List<Task> TaskPool = new List<Task>();
foreach (TargetType Item in Source)
{
TargetType localItem = Item;
TaskPool.Add(Task.Factory.StartNew(() => DoSomething(localItem)));
}
Task.WaitAll(TaskPool.ToArray());
Но как Parallel.Foreach
, я использую его, как это:
Parallel.ForEach(Source, (TargetType item) => DoSomething(item));
Таким образом, нет локальной переменной, как вы видите. Но как работает Parallel.Foreach
? Нет необходимости вводить какие-либо локальные переменные? или, если необходимо, как я могу его определить?
UPDATE
Есть ли разница в .NET 4 и .NET 4.5?
Начиная с C# 5, на самом деле локальная переменная не нужна, поскольку переменные цикла семантически находятся внутри цикла. –
@mikez Что значит цикл? вы подразумеваете как «foreach», так и «Parallel.foreach»? Если да? так как насчет .NET 4? – Saeid
В C# 5 локальная переменная не нужна в цикле foreach (я бы сказал, что «Parallel.ForEach» - это вызов метода, а не цикл). В C# 4 это необходимо. Я также хотел бы отметить, что это поведение компилятора, а не поведение во время выполнения. Это «разрыв» с предыдущими версиями компилятора. См. Http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx –