C# 局部变量中的Parallel.Foreach vs Foreach和Task
当我们使用C# 局部变量中的Parallel.Foreach vs Foreach和Task,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,当我们使用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
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(Source, (TargetType item) => DoSomething(item));
因此,正如您所看到的,没有任何局部变量。但是,Parallel.Foreach
是如何工作的呢?是否不需要引入任何局部变量?或者,如果需要,我如何定义它
更新
.NET 4和.NET 4.5之间有什么区别吗?您没有在
并行中定义任何局部变量。ForEach
-项
只不过是一个形式参数-并行的实现代码。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));
}
}
void DoSomething(项目类型项目,其他类型其他){
}
作废您的函数(IEnumerable items,IEnumerable others){
foreach(其他中的var otherItem){
var localOtherItem=otherItem;
Parallel.ForEach(items,item=>DoSomething(item,localOtherItem));
}
}
您可以看到上面的区别:localOtherItem
取自定义匿名函数的上下文:这称为闭包。而items
中的项只作为方法参数传递给匿名函数
简而言之:
并行中的项
。ForEach
和C#ForEach
中的项
是两个非常不同的问题。从C#5开始,实际上局部变量是不必要的,因为循环变量在语义上是在循环内部的。@mikez循环是什么意思?你是说foreach和并行。foreach?如果有的话?那么.NET 4呢?在C#5中,foreach
循环中不需要局部变量(我想说Parallel.foreach
是一个方法调用,而不是循环)。在C#4中,这是必要的。我还要指出,这是编译器行为,而不是运行时行为。这是对以前编译器版本的“突破性”更改。看,请告诉我什么是如此严重的错误,它是如此沉重的否决票。我真的curious@GennadyVanin--Novosibirsk我不知道为什么其他人投了反对票,但在我的例子中:第一:.Net 4.5被标记,因为我使用.Net 4.5;第二:两个版本都是正确的,没有一个是错误的;第三:你的描述如此含糊不清,你粘贴的代码为什么要同时使用Parallel.foreach和Task以及Taskpool,你有什么优势?而且在你的更新中:没有相同的结果。谢谢