MWE は次のとおりです。
Func<Int32, Boolean> MyFunc = (s) => {
var res = false;
// Insert function logic to modify the value to res
return res;
};
var Result = new List<Int32> ();
var LockObj = new Object ();
ParallelEnumerable.Range (1, 100000)
.ForAll (s => {
if (MyFunc (s)) {
lock (LockObj) { // IS THIS NECESSARY?
Result.Add (s);
} // End lock
}
});
突き詰めるとこんな状況です。ParallelEnumerable ステートメントの実行が完了する前にクエリを実行しない場合、Result をロックする必要はないと考えるのは正しいですか?
注意:MWEは、次のように「Where」句で解決する方がよいことを知っています。
ParallelEnumerable.Range (1, 100000)
.Where (s => MyFunc (s));
しかし、MWE で明らかにされていない理由により、これは実行できません。
編集
答えてくれたみんなありがとう。コメントもありがとうございます。Tung が見つけたエラーを修正しました。