Taskを合成する
複数の非同期処理を独立して開始し、まとめて待つ場合はTask.WhenAllを利用できます。
Task<int> first = GetValueAsync(10);
Task<int> second = GetValueAsync(20);
int[] values = await Task.WhenAll(first, second);
Console.WriteLine(values[0] + values[1]);
static async Task<int> GetValueAsync(int value)
{
await Task.Delay(50);
return value;
}
順番にawaitする必要がない独立処理をまとめることで、待ち時間を短縮できる場合があります。
キャンセル
CancellationTokenを処理の入口から下位メソッドへ渡し、定期的にキャンセル要求を確認します。キャンセルは強制停止ではなく、処理側が協調して終了する仕組みです。
例外の扱い
Task.WhenAllで複数処理を待つ場合、いずれかの処理が失敗するとawaitで例外が通知されます。どの処理が失敗したかを把握できるよう、ログやエラー境界を設計します。
ConfigureAwait
ライブラリコードでは、呼び出し元の同期コンテキストへ戻る必要がない場合にConfigureAwait(false)を検討します。アプリケーションのUIコードなどでは、コンテキストへの復帰が必要なことがあります。用途を理解せず機械的に付けないでください。