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