平行的.局部变量中的Foreach vs Foreach和Task
本文关键字:Foreach vs Task 局部变量 | 更新日期: 2023-09-27 18:07:36
当我们使用foreach
和Tasks
时,我们需要使用这样的局部变量:
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
是如何工作的呢?不需要引入任何局部变量吗?或者如果需要,我该如何定义它?
.NET 4和。net 4.5有什么不同吗?
您没有在Parallel.ForEach
中定义任何局部变量- item
只不过是一个形式参数- Parallel.ForEach
的实现代码是必须处理变量的代码,无论它们是本地的,捕获的还是其他的。
不需要定义与形式参数Parallel.ForEach
相关的局部变量-匿名委托的调用者代码将处理该变量并将其传递给函数。
但是在c# 4中,如果捕获另一个变量,可能需要使用局部变量,即:
void DoSomething(ItemType item, OtherType other) {
}
void YourFunction(IEnumerable<ItemType> items, IEnumerable<OtherType> others) {
foreach (var otherItem in others) {
var localOtherItem = otherItem;
Parallel.ForEach(items, item => DoSomething(item, localOtherItem));
}
}
您可以看到上面的区别:localOtherItem
取自定义匿名函数的上下文中:称为闭包。而items
中的项只是作为方法参数传递给匿名函数。
简而言之:Parallel.ForEach
中的item
和c# foreach
中的item
是两个非常不同的问题。