single.php

C# WinUI3で複数の非同期処理がすべて完了した通知を得たい場合の対処法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで非同期処理を複数実行した場合に、すべての非同期処理の完了を待ちたい場合の対処法です。

非同期処理の終了をまとめて管理

例えば、非同期型のプロシージャーを用意してループ処理で反復させます。

foreach (var img in images)
{
  //非同期で画像を追加
  await AddPhotoAsync(...);
}

複数の画像などをリストにして表示したい場合など、1つの処理を待つことなく連続して処理を並列で行うようになるので効率的に処理が進みます。

確かに便利なんですが、すべての非同期処理が終了後に次の処理が行いたい場合(並んだリストの並べ替えなど)には、このままだと処理の完了を取得する手段がありません。

[WhenAll]でTaskの処理を取得

非同期処理するプロシージャーの戻り値を[Task]にすると、WhenAllメソッドですべての処理の終了が取得できます。

例えば、非同期処理を行うプロシージャーの戻り値をTaskにします。

private async Task AddPhotoAsync(...);

複数の非同期処理を管理するリスト変数を作成します。

List<Task> loadTasks = new();

実行した非同期処理を変数に追加していきます。

foreach (var img in images)
{
    //非同期処理をまとめて実行するためにタスクをリストに追加
    loadTasks.Add(
        //非同期で画像を追加
        AddPhotoAsync(...)
    );
}

最後に、[Task.WhenAll]で、追加した非同期処理がすべて終了するまで待ちます。

// 全ての画像の読み込みが完了するの待つ
await Task.WhenAll(loadTasks);

まとめて書くと、こんな感じのコードになります。

List<Task> loadTasks = new();

foreach (var img in images.OrderBy(i => i.Order))
{
    //非同期処理をまとめて実行するためにタスクをリストに追加
    loadTasks.Add(
        //非同期で画像を追加
        AddPhotoAsync(...)
    );
    index++;
}

// 全ての画像の読み込みが完了するの
await Task.WhenAll(loadTasks);

まとめ

今回は、短い記事ですが、WinUI3プロジェクトで非同期処理を複数実行した場合に、すべての非同期処理の完了を待ちたい場合の対処法について紹介しました。

List型の変数を用意して、非同期処理を実行する際に変数で管理を行います。

その後に[WhellAll]メソッドで、追加した非同期処理の終了が取得できるようになります。

WinUI 3 アプリで、複数の非同期処理がすべて終了するまで待って、次の処理に進みたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です