for WPF developers
重たい処理をおこなう場合に非同期処理をよく用いますが、 その処理結果に戻り値を伴うケースも少なくありません。 ここでは async/await 演算子による非同期処理で戻り値を取得する例を紹介します。
ページ内リンク
ここでは「async/await による非同期処理 その 1」で示したサンプルプログラムをそのまま流用します。
戻り値のない非同期処理を記述するときは
「async/await による非同期処理 その 1」で示したサンプルプログラムのように
次のように System.Windows.Tasks.Task クラスを返すように記述しました。
/// <summary>
/// 重たい処理を非同期で実行します。
/// </summary>
private async void HeavyWorkAsync()
{
IsBusy = true;
Result = "只今実行中...";
System.Console.WriteLine("Thread[{0}] 非同期処理を実行します。", Thread.CurrentThread.ManagedThreadId);
await HeavyWork();
// ここで一旦 return される
// 非同期処理が終了したらここから再開する
System.Console.WriteLine("Thread[{0}] 非同期処理を実行しました。", Thread.CurrentThread.ManagedThreadId);
Result = "終了しました。";
IsBusy = false;
}
/// <summary>
/// 重たい処理を実行するタスクを返します。
/// </summary>
/// <returns>重たい処理を実行するタスク</returns>
private Task HeavyWork()
{
return Task.Run(() =>
{
System.Console.WriteLine("Thread[{0}] 重たい処理を実行します。", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
System.Console.WriteLine("Thread[{0}] 重たい処理を終了します。", Thread.CurrentThread.ManagedThreadId);
});
}
/// <summary>
/// 重たい処理を非同期で実行します。
/// </summary>
private async void HeavyWorkAsync()
{
IsBusy = true;
Result = "只今実行中...";
System.Console.WriteLine("Thread[{0}] 非同期処理を実行します。", Thread.CurrentThread.ManagedThreadId);
var str = await HeavyWork();
// ここで一旦 return される
// 非同期処理が終了したらここから再開する
System.Console.WriteLine("Thread[{0}] 非同期処理を実行しました。", Thread.CurrentThread.ManagedThreadId);
Result = "終了しました。 [" + str + "]";
IsBusy = false;
}
/// <summary>
/// 重たい処理を実行するタスクを返します。
/// </summary>
/// <returns>重たい処理を実行するタスク</returns>
private Task<string> HeavyWork()
{
return Task.Run(() =>
{
System.Console.WriteLine("Thread[{0}] 重たい処理を実行します。", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
System.Console.WriteLine("Thread[{0}] 重たい処理を終了します。", Thread.CurrentThread.ManagedThreadId);
return "重かったよぅ...";
});
}
var str = await HeavyWork();
実行結果は以下のようになります。
Designed by CSS.Design Sample