WPFアプリケーションでasync await を用いた非同期処理を実装する - WPF

WPFアプリケーションでasync await を用いた非同期処理を実装するコードを紹介します。

プログラム

UI

下図のUIを作成します。フォームにButtonとTextBoxを配置します。

コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfAsyncProc
{
  /// <summary>
  /// Window1.xaml の相互作用ロジック
  /// </summary>
  public partial class WindowAsyncFunc : Window
  {
    public WindowAsyncFunc()
    {
      InitializeComponent();
    }

    private async void button_Click(object sender, RoutedEventArgs e)
    {
      for (int i = 0; i < 100; i++) {
        await AsyncTaskFunc();
        textBox.Text += "Message:" + Convert.ToString(i) + "\r\n";
      }
    }

    public async Task AsyncTaskFunc()
    {
      Func<int> asyncJob = ProcFunc;
      int ret1 = await Task.Run(asyncJob);
    }

    public int ProcFunc()
    {
      //時間のかかる処理
      System.Threading.Thread.Sleep(200);
      return 0;
    }
  }
}

解説

  for (int i = 0; i < 100; i++) {
    await AsyncTaskFunc();
    textBox.Text += "Message:" + Convert.ToString(i) + "\r\n";
  }
非同期関数により、AsyncTaskFunc()の実行が完了した時点で、次の行のtextBox.Text への代入文が実行されます。

AsyncTaskFunc() メソッドでは、Taskクラスを利用して、別スレッドで時間のかかる処理を実行します。別スレッドで実行されるため、制御はすぐに戻りますが、awaitで呼び出された非同期関数のため、別すれ度の実行が終了するまで、awaitの次の行は実行しません。
    public async Task AsyncTaskFunc()
    {
      Func<int> asyncJob = ProcFunc;
      int ret1 = await Task.Run(asyncJob);
    }

    public int ProcFunc()
    {
      //時間のかかる処理
      System.Threading.Thread.Sleep(200);
      return 0;
    }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Button]をクリックします。アプリケーションはフリーズせずに、テキストボックスにメッセージを表示し続けます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2017-09-04
作成日: 2016-06-09
iPentec all rights reserverd.