2013-04-06 30 views
1

當我們使用foreachTasks我們需要使用局部變量是這樣的:Parallel.Foreach VS的foreach和任務局部變量

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有什麼區別?

+0

從C#5開始,實際上本地變量是不必要的,因爲循環變量在循環內部是語義上的。 – 2013-04-06 05:52:36

+0

@mikez你是什麼意思的循環?你的意思是'foreach'和'Parallel.foreach'?如是?那麼.NET 4如何? – Saeid 2013-04-06 06:01:57

+1

在C#5中,'foreach'循環中不需要局部變量(我會說'Parallel.ForEach'是一個方法調用而不是循環)。在C#4中是必要的。我還會注意到這是編譯器行爲,而不是運行時行爲。這是從以前的編譯器版本的「突破」變化。見http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – 2013-04-06 06:15:12

回答

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中的項目僅作爲方法參數傳遞給匿名函數。

總之:itemParallel.ForEachitem在C#foreach是兩個非常不同的問題。