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

このページのタグ:[C#] [WPF] [Task]
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について
iPentec all rights reserverd. (ISDC)