Parallel.Foreach vs Foreach和Task in local variable
当我们使用foreach
和Tasks
我们需要使用这样的局部变量:
List TaskPool = new List(); 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有什么区别吗?
你没有在Parallel.ForEach
定义任何局部变量 – item
只不过是一个forms参数 – Parallel.ForEach
的实现代码是必须处理变量的实现代码,以及它们是本地的,捕获的还是其他的。
无需定义与forms参数Parallel.ForEach
相关的局部变量 – 匿名委托的调用者代码将处理变量并将其传递给您的函数。
但是在C#4中,如果捕获另一个变量,则可能需要使用局部变量,即:
void DoSomething(ItemType item, OtherType other) { } void YourFunction(IEnumerable items, IEnumerable others) { foreach (var otherItem in others) { var localOtherItem = otherItem; Parallel.ForEach(items, item => DoSomething(item, localOtherItem)); } }
您可以看到上面的差异: localOtherItem
取自定义匿名函数的上下文:称为闭包。 项目中的items
仅作为方法参数传递给匿名函数。
简而言之: Parallel.ForEach
的item
和C# foreach
中的item
是两个非常不同的问题。