[英]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.