23

Web ページを作成していて、いくつかの Web サービスを呼び出しています。呼び出しは次のようになりました。

var Data1 = await WebService1.Call();
var Data2 = await WebService2.Call();
var Data3 = await WebService3.Call();

コードレビュー中に、次のように変更する必要があると言われました。

var Task1 = WebService1.Call();
var Task2 = WebService2.Call();
var Task3 = WebService3.Call();

var Data1 = await Task1;
var Data2 = await Task2;
var Data3 = await Task3;

なんで?違いは何ですか?

4

3 に答える 3

33

最初のコード スニペットでは、最初のサービス コールが完了するまで 2 番目のサービス コールを開始していません (同様に、2 番目のサービス コールが完了するまで 3 番目のサービス コールも開始していません)。つまり、それらは順次実行されます。

2 番目のスニペットでは、3 つのサービス呼び出しすべてを開始しますが、3 つすべてが完了するまでコードを続行しないでください。つまり、それらはすべて並行して実行されます。

前の操作の結果が得られるまで 2 番目または 3 番目の呼び出しを開始できない場合は、それを機能させるために最初のスニペットのようなことを行う必要があります。サービス呼び出しが相互にまったく依存しない場合は、パフォーマンス上の理由からそれらを並行して実行する必要があります。

何らかの理由で余分なローカル変数を使用するのが本当に嫌な場合は、別の構文を使用してタスクを並行して実行する別の方法があります。2番目のオプションのように機能する1つの選択肢は次のとおりです。

var Data = await Task.WhenAll(WebService1.Call(), 
    WebService2.Call(), 
    WebService3.Call());
于 2013-05-30T19:15:34.883 に答える