複数待ち vs Task.WaitAll - 同等?
質問
パフォーマンスに関して、以下の2つのメソッドは実行可能でしょうか?
GetAllWidgets()
と
GetAllFoos()
を並列に並べるのですか?
どちらかを使うべき理由はあるのでしょうか?コンパイラの裏側でいろいろなことが起こっているようなので、明確にはわかりません。
方法A:複数のawaitを使用する方法 ==================================================================================================
public async Task<IHttpActionResult> MethodA()
{
var customer = new Customer();
customer.Widgets = await _widgetService.GetAllWidgets();
customer.Foos = await _fooService.GetAllFoos();
return Ok(customer);
}
================================= MethodB: Task.WaitAllを利用する ==================================================================================
public async Task<IHttpActionResult> MethodB()
{
var customer = new Customer();
var getAllWidgetsTask = _widgetService.GetAllWidgets();
var getAllFoosTask = _fooService.GetAllFos();
Task.WaitAll(new List[] {getAllWidgetsTask, getAllFoosTask});
customer.Widgets = getAllWidgetsTask.Result;
customer.Foos = getAllFoosTask.Result;
return Ok(customer);
}
=====================================
どのように解決するのですか?
最初のオプションは、2つの操作を同時に実行しません。1つ目の処理を実行し、その完了を待って、2つ目の処理を実行します。
2番目のオプションは、両方を同時に実行しますが、同期的に(つまり、スレッドをブロックしながら)待ちます。
1番目のオプションは2番目のオプションより遅く完了し、2番目のオプションは必要なくスレッドをブロックするので、両方のオプションを使用するべきではありません。
で非同期に両方の操作を待つべきです。
Task.WhenAll
:
public async Task<IHttpActionResult> MethodB()
{
var customer = new Customer();
var getAllWidgetsTask = _widgetService.GetAllWidgets();
var getAllFoosTask = _fooService.GetAllFos();
await Task.WhenAll(getAllWidgetsTask, getAllFoosTask);
customer.Widgets = await getAllWidgetsTask;
customer.Foos = await getAllFoosTask;
return Ok(customer);
}
ただし
Task.WhenAll
が完了した後、両方のタスクがすでに完了しているので、それらを待つとすぐに完了することに注意してください。
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] なぜ、複数のawaitではなく、単一のawait Task.WhenAllを選択する必要があるのでしょうか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] 複数の列でグループ化する
-
[解決済み] SQL Server の DataTypes に相当する C# の機能
-
[解決済み] 複数のタスクにasync/awaitを使用する
-
[解決済み】複数のタスクを待機させ、異なる結果を得ることができる。
-
[解決済み] この非同期メソッドは'await'演算子を持たないため、同期的に実行されます」という警告を気にする必要があるか?
-
[解決済み] 非同期コードからの非同期メソッドの呼び出し
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] 関数を終了するには?
-
[解決済み】プロセスが実行されているかどうかを知るには?