← C#

LESSON / ARTICLE

非同期処理の応用

Taskの合成、キャンセル、例外伝播、ConfigureAwaitなどを理解します。

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コードなどでは、コンテキストへの復帰が必要なことがあります。用途を理解せず機械的に付けないでください。