1

当我们使用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 有什么区别吗?

4

1 回答 1

2

您没有定义任何局部变量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只是作为方法参数传递给匿名函数。

简而言之:C#中的iteminParallel.ForEach和in是两个非常不同的问题。itemforeach

于 2013-04-06T11:19:18.730 回答