tips - async/await による非同期処理 その 2

 重たい処理をおこなう場合に非同期処理をよく用いますが、 その処理結果に戻り値を伴うケースも少なくありません。 ここでは async/await 演算子による非同期処理で戻り値を取得する例を紹介します。

ページ内リンク

概要

 ここでは「async/await による非同期処理 その 1」で示したサンプルプログラムをそのまま流用します。

Fig.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);
    });
}
Code 1 : 戻り値を持たない非同期処理の記述
これに対し、戻り値を持つようにするには System.Windows.Tasks.Task<T> クラスを返すようにします。 例えば string 型を返すには次のように Task<string> クラスを返します。
/// <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 "重かったよぅ...";
    });
}
Code 2 : string 型を戻り値として持つ非同期処理の記述
この戻り値を受け取るときは
var str = await HeavyWork();
というようにします。await 演算子が戻り値の Task<string> 型の Task をくり抜いて string 型の戻り値を取得するため、 上記の str 変数は Task<string> クラスではなく、string 型となります。

 実行結果は以下のようになります。

Fig.2 : 渡された文字列が表示されている

Designed by CSS.Design Sample