5

現在、データのさまざまなプロバイダーに対して約 7 つの Web サービス呼び出しを行う必要があるコードのセクションがあります。各呼び出しの実行には数秒かかるため、それらを並行して実行して速度を上げたいと考えています。

私は 7 つの呼び出しを Parallel.Invoke でラップしました。これは、同時にいくつかのことを実行するのに最適ですが、2 コア サーバーでは、コアごとに 1 つずつ、一度に 2 つしか実行されません。私がしているのは Web サービス呼び出しが返されるのを待っているだけなので、7 つすべてを取得して戻ってくるのを待ちたいと思います。

これを行う方法はありませんか?それとも私のアプローチが間違っているのでしょうか?Web サービスへの非同期呼び出しを作成する必要があるのでしょうか? しかし、次に進む前に、それらすべてが戻ってくるのをどのように待つのでしょうか?

4

4 に答える 4

5

ただし、2 コア サーバーでは、コアごとに 1 つずつ、一度に 2 つしか実行されません。

私はこれに疑問を呈します.Parallel.Invokeは通常、システムのコアよりも多くのタスクを実行します.

そうは言っても、非同期メソッド呼び出し呼び出しを使用している場合は、Task.Factory.FromAsync(...)を使用して 7 つの異なるタスクを生成することをお勧めします。

これにより、タスクの実行中に他の作業を行い、結果を使用することに決めたときにTask.WaitAll(または) を呼び出すという柔軟性が提供されます。Task.WaitAny

一方、Parallel.Invoke は、7 つすべてが完了するまで常にブロックします。

于 2010-09-14T23:04:21.730 に答える
1

これを使用する必要はありませんParallel.Invoke。先に進んで、複数の非同期リクエスト (つまりHttpWebRequest.BeginGetResponse()) を発行できます。すべてが完了したときに通知を受け取るには、いくつかのオプションがあります。簡単な方法は、最初のリクエストを発行する前にCountdownEventを初期化し、リクエストの発行後にメイン スレッドをそのイベントで待機させることです。非同期コールバック メソッドはそれぞれ、完了するとそのイベントを通知します。こうすることで、メイン スレッドが続行する前に、すべての要求が完了していることを確認できます。

于 2010-09-14T23:05:43.397 に答える
0

別の質問に対する回答をそのままコピーします。それ以上ではないにしても、同等に適用できるからです。


I/O パフォーマンスに関しては、非同期プログラミング モデル (APM) に勝るものはありません。いつでも使用できる場合は、使用する必要があります。幸いなことに、Task Parallel Library (TPL) には、FromAsync ファクトリ メソッドを介して、APM の作業を「純粋な」TPL タスクと組み合わせるサポートが組み込まれています。

これら 2 つのプログラミング モデルを組み合わせて非同期の極楽を実現する方法の詳細については、MSDN の .NET SDK のこのセクション「TPL と従来の .NET 非同期プログラミング」を参照してください。

于 2010-09-15T15:36:16.097 に答える
0

ParallelOptions同時実行レベルを上げるように指定できます。デフォルトは、CPU バウンドのタスクには妥当ですが、I/O バウンドのタスクを扱っているため、その動作をオーバーライドすることは理にかなっています。

于 2010-09-14T23:04:02.460 に答える