簡體   English   中英

使用PLINQ返回null

[英]returning null with PLINQ

我有一個IEnumerable的擴展方法,然后迭代集合,做它的業務,然后返回一個新的IEnumerable。

我試圖使用.AsParallel()。ForAll()來顯着加速迭代(當然它應該這樣做),但是當返回集合時,該集合中通常有一些對象是null。

我假設這可能是因為它在所有'業務'有機會完成之前返回集合? 如果我調試並放入斷點,則沒有空值。

我應該使用某種“等待這個操作完成”的方法嗎?

編輯:要更清楚一點,在forall中有業務邏輯,修改屬性等。有必要循環一個動作,而不是簡單地選擇一些東西。

答案取決於返回的含義,因為ForAll方法不會返回任何內容。 它會為集合的所有元素並行調用您指定的委托。 我想你的代碼看起來像這樣:

data.AsParallel().ForAll(() => /* calculate and store result somewhere */);
// more code

ForAll方法不等待所有委托完成,因此在所有委托完成之前可以執行more code (並且您還需要在store result somewhere小心一點,因為它可能同時為多個委托運行!)

我認為使用Select方法可以更優雅地重寫代碼:

var res = data.AsParallel().Select(() => /* calculate the result */);

在這種情況下,委托只返回結果。 Where方法收集所有結果,當您迭代返回的IEnumerable ,它保證所有委托完成計算。

ForAll()不執行合並,並立即返回。 Parallel.ForEach()可能是您正在尋找的功能。

即代替:

collection.AsParallel().ForAll( t=>t.doWork() );

就像是

Parallel.ForEach(collection.AsParallel(), t=>t.doWork());

暫無
暫無

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

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