Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 局部变量中的Parallel.Foreach vs Foreach和Task_C#_Parallel Processing_Task Parallel Library - Fatal编程技术网

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,你有什么优势?而且在你的更新中:没有相同的结果。谢谢