簡體   English   中英

Parallel.Foreach與Foreach和局部變量中的Task

[英]Parallel.Foreach vs Foreach and Task in local variable

當我們使用foreachTasks我們需要使用如下局部變量:

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如何工作? 不需要引入任何局部變量嗎? 或者,如果需要,該如何定義?

UPDATE

.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只是作為方法參數傳遞給匿名函數。

總之:該itemParallel.ForEachitem在C#中foreach是兩個完全不同的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM