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