簡體   English   中英

AsParallel.ForAll 與 Parallel.ForEach

[英]AsParallel.ForAll vs Parallel.ForEach

以下代碼片段之間是否有任何區別。 如果是這樣,是什么?

myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });

Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });

主線程會等待所有子線程完成嗎? 在 MVC 應用程序中,如果我在控制器操作中進行並行處理,主線程完成后子線程會發生什么。 它們會被中止還是會在主線程完成后完成?

Parallel.ForEach()正是為這種代碼設計的。

另一方面, ForAll()旨在用於(可能是復雜的)PLINQ 查詢的末尾。

因此,我認為Parallel.ForEach()是這里更好的選擇。

在這兩種情況下,當前線程將用於執行計算(以及線程池中的一些線程),並且該方法僅在所有處理完成后才會返回。

這是MSDN中的解釋:

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/potential-pitfalls-with-plinq#prefer-forall-to-foreach-when-it-is-possible

根據我閱讀的內容,如果您想確保按順序訪問列表,請使用Parallel.ForEach() ,而使用AsParallel.ForAll()不能保證按順序訪問列表中的項目。

對於MVC,所有線程都是基於請求的。 調用者線程(主線程)被阻塞,直到 Parallel() 調用完成,這意味着所有子線程也應該已經完成​​。

如果調用者線程正在中止,這里是一個解釋:

http://www.albahari.com/threading/part5.aspx

PLINQ 不會搶先中止線程,因為這樣做有危險。 相反,在取消時,它會等待每個工作線程在結束查詢之前完成其當前元素。 這意味着查詢調用的任何外部方法都將運行完成。

正如C# Cookbook中的Concurrency所寫:

Parallel和 PLINQ 之間的一個區別是 PLINQ 假設它可以使用計算機上的所有內核,而Parallel會動態地對不斷變化的 CPU 條件做出反應。

您可以選擇使用 AsParallel().AsOrdered() 對元素進行排序。 在 Parallel.ForEach 中訂購不是開箱即用的,我們需要這樣做。

暫無
暫無

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

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