async/await を使った非同期ラムダ式を変数に代入する方法

More than 3 years have passed since last update.

async/await を使った非同期ラムダ式を変数に代入したくなった時に

ラムダ式を代入するための変数の型がわからなくなったので、覚書として残しておきます。


引数なし、戻り値なし

async/await を用いた「戻り値なしの非同期関数」は、戻り値が Task で必要があるので、

この時の非同期ラムダ式の型は Func<Task> となります。

using System.Threading.Tasks;

Func<Task> AsyncFunc = async () =>
{
await Task.Delay(1);
};


引数あり(int)、戻り値なし

引数に int が追加されただけなので、

この場合の非同期ラムダ式の型は Func<int, Task> となります。

using System.Threading.Tasks;

Func<int, Task> AsyncFunc2 = async (int time) =>
{
await Task.Delay(time);
};


引数なし、戻り値あり(bool)

async/await を用いた「戻り値ありの非同期関数」は、戻り値が Task<【戻り値の型】> で必要があるので、

この場合の非同期ラムダ式の型は Func<Task<bool>> となります。

using System.Threading.Tasks;

Func<Task<bool>> AsyncFunc3 = async () =>
{
await Task.Delay(1);
return true;
};


引数あり(int)、戻り値あり(bool)

引数に int が追加されただけなので、

この場合の非同期ラムダ式の型は Func<int, Task<bool>> となります。

using System.Threading.Tasks;

Func<int, Task<bool>> AsyncFunc4 = async (int time) =>
{
await Task.Delay(time);
return true;
};