[英]Parallel.Foreach vs Foreach and Task in local variable
當我們使用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
如何工作? 不需要引入任何局部變量嗎? 或者,如果需要,該如何定義?
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
只是作為方法參數傳遞給匿名函數。
總之:該item
在Parallel.ForEach
和item
在C#中foreach
是兩個完全不同的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.