4

.aspx ページで次のようなタスク並列ライブラリを使用しています。

 Parallel.Invoke(
                new Action[]
                    {
                        () => { users= service.DoAbc(); },
                        () => { products= service.DoDef(); }
                    });

以前は、呼び出しごとにスレッドを起動していましたが、Parallel.Invoke を使用すると、応答性が向上しました。

TPLライブラリが最善を尽くすと仮定すべきですか、それとも実際に並列呼び出しを行うように微調整する方法はありますか?

私のウェブサイトが実行されているハードウェアの種類に帰着すると思いますが、これは VM であると私は信じています。

各呼び出しは、API 呼び出しから結果を取得するために http 要求を作成します。

4

2 に答える 2

5

Parallel.Invoke は、メソッドを順次実行するよりもコストがかかるか、スレッドプールに使用可能なスレッドがない場合を除き、メソッドを並列で実行します。これは最適化であり、問​​題ではありません。通常の状況では、フレームワークを再考しようとせず、ただその仕事を任せるべきです。

長時間実行される IO バウンド メソッドを呼び出す場合は、この動作をオーバーライドすることを検討する必要があります。Parallel.Invoke は、デフォルトの TaskScheduler を使用します。これは、CPU の過負荷を避けるために、コアと同じ数のスレッド (数は不明) を使用します。アクションが何らかの IO またはネットワーク呼び出しが完了するのを待つだけの場合、これは問題になりません。

Parallel.Invoke(ParallelOptions,Action[])] 1オーバーライドを使用して、スレッドの最大数を指定できます。ParallelOptionsクラスを使用して、キャンセル トークンを渡したり、カスタム TaskScheduler (デフォルトのスケジューラよりも多くのスレッドを使用できるようにするものなど) を指定したりすることもできます。

次のようにコードを書き直すことができます。

Parallel.Invoke(
            new ParallelOptions{MaxDegreeOfParallelism=30},
            new Action[]
                {
                    () => { users= service.DoAbc(); },
                    () => { products= service.DoDef(); }
                });

それでも、実際のパフォーマンスの問題が見つからない限り、デフォルトのオプションを変更しようとしないでください。CPU をオーバーサブスクライブして、遅延やスラッシングを引き起こす可能性があります。

于 2013-05-09T14:40:53.683 に答える