3753817_s

C#の非同期処理でawaitとasyncを使ったときに戻り値を受け取る方法を調べたので忘備録として記録していきます。

async/awaitの基本的な使い方は以下にまとめています。




戻り値なしの場合


戻り値なしの場合は、voidまたはTaskを戻り値として設定します。

ただ、voidを設定した場合はawaitを使って待つことはできません。

static async Task Main()
{
    Console.WriteLine("Start");
    AsyncProcess();
    Console.WriteLine("End");
}
    
private static async void AsyncProcess()
{
    await Task.Run(() =>
    {
        for (int i = 0i < 1000; ++i)
        {
            Console.WriteLine(i);
        }
    });
}

そのため非同期処理でしか呼びだないような関数の場合はTaskを使った方がよさそうです。

非同期処理でvoidを使うメリットはあまりありませんね。

static async Task Main()
{
    Console.WriteLine("Start");
    AsyncProcess();
    await AsyncProcess();
    Console.WriteLine("End");
}







戻り値を受け取りたい場合


戻り値を受け取りたい場合は、戻り値の方にTask<T>を設定します。

Tにはintやstringのように受け取りたい戻り値の方が入り、Task<int>、Task<string>のように書きます。

ただ、呼び出し元や呼び出し先では型がTask<T>であることを意識しなくても大丈夫です。

Task<int>の場合はint型を戻り値として扱うのと同じように書くことができます。

サンプルは以下の通りです。

static async Task Main()
{
    int nRet = await retInt();
    Console.WriteLine(nRet);

    string strRet = await retStr();
    Console.WriteLine(strRet);
}
    
private static async Task<intretInt()
{
    int n = 0;
    await Task.Run(() =>
    {
        for (int i = 0i < 10; ++i)
        {
            n += i;
        }
    });
    return n;
}

private static async Task<stringretStr()
{
    int n = 0;
    await Task.Run(() =>
    {
        for (int i = 0i < 10; ++i)
        {
            n += i;
        }
    });
    return n.ToString();
}

非同期処理で戻り値を受け取ることができるのはawaitで待つ時だけなので注意しましょう。

awaitを使わずに関数の値を取得したい場合はメンバ変数とかに入れるのがよさそうですね。



まとめ


今回はasync/awaitを使ったときに戻り値を受け取る方法を学びました。

戻り値の方としてTask<T>を使うことさえ忘れなければ簡単に使えますね。