2011-02-16 6 views
4

私は、並列処理を使用して800個ほどのレポートを作成するレポート作成クラスを用意しています。Parallel.ForEachの動作を変更しましたか?

それは次のコードで罰金働いていた昨日まで:

Parallel.ForEach(reports, report => { this.Build(report); }); 

注:デバッグの目的のために、私はテストプロジェクトで書かれたテストからコードをexceutingよ。

昨日、失敗し始めました。リソースモニタを掘り下げていくと、qtagent32.exe(テストランナー)に関連するスレッド数が増えていて、最終的にプロセスが失敗することが判明しました。突然何かがブロックされたように見えました。

私は私のコードを少し変更して問題を解決することができました:

Parallel.ForEach(reports, new ParallelOptions { MaxDegreeOfParallelism = 4 }, report => { this.Build(report); }); 

しかし、私はまだ変更か疑問に思うままにしていますか?

+3

同じマシンですか?別のマシンですか? –

+0

同じマシン、同じコード... –

答えて

1

少し遅くなるには1つの要素しか必要ありません。それが本当に「同じコード」、つまり同じレポートであれば、それはデータベースであった可能性があります。少しだけデータを追加すると、クエリが少し遅くなります。

TPLはThreadPoolの上にあり、ThreadPoolはゆっくりと新しいスレッドを追加します。

レポートの1つがしきい値(500ミリ秒)を超えると、TPが余分なスレッドを作成することを指定します。あなたのレポートが、その余分なスレッドよりも何か(ディスクI/Oの可能性が高い)を競合すると、他のレポートもしきい値を超える可能性が高くなります。その結果、雪崩が発生します。

新しいFx4スレッドプールは以前のものよりもスマートですが、それでも未加工のヒューリスティックです。 MaxDegreeOfParallelismは適切なソリューションです。

+0

Thanks Henk、レポートはディスクI/Oと明らかに競合しており、サードパーティのPDFライティングライブラリを使用しています(正確には高速ではありません)。生成する秒数。これはレポート作成前に完了しているため、データアクセスは問題ではありません。 –

関連する問題