簡體   English   中英

Parallel.ForEach()與foreach(IEnumerable <T> .AsParallel())

[英]Parallel.ForEach() vs. foreach(IEnumerable<T>.AsParallel())

Erg,我正在嘗試使用Reflector在BCL中找到這兩個方法,但找不到它們。 這兩個片段之間的區別是什么?

A:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

B:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

使用一個比另一個有不同的后果嗎? (假設我在兩個示例的括號內部所做的事情都是線程安全的。)

他們做的事情完全不同。

第一個采用匿名委托,並在所有不同的項目上並行運行此代碼的多個線程。

第二個在這種情況下不是很有用。 簡而言之,它旨在對多個線程進行查詢,並組合結果,並將其再次提供給調用線程。 因此,foreach語句中的代碼始終位於UI線程上。

只有在AsParallel()調用右側的linq查詢中執行一些昂貴的操作才有意義,例如:

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));

不同的是,B不是平行的。 AsParallel()所做的唯一事情是它包裝了IEnumerable ,因此當你使用LINQ方法時,會使用它們的並行變體。 包裝器的GetEnumerator() (在foreach的幕后使用)甚至返回原始集合的GetEnumerator()

順便說一句,如果你想查看Reflector中的方法, AsParallel()是在System.Core程序集中的System.Linq.ParallelEnumerable類中。 Parallel.ForEach()位於mscorlib程序集(名稱空間System.Threading.Tasks )中。

第二種方法不是平行的,在你的例子中使用AsParallel()的正確方法

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});

暫無
暫無

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

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