C#のプログラムでasyncが付いたメソッドを作って呼び出したとき、CS4008 'void'を待機することができませんのエラーが出ることがあります。
private async void button1_Click( object sender, EventArgs e )
{
await HeavyTask();
}
public async void HeavyTask()
{
await Task.Delay( 1000 );
return;
}
これは、C#ではasync void定義を行った関数をawait付きで呼び出しすることができない為、エラーになっています。
対処方法
このエラーが出たときは、以下のようにasync void
から、async Task
へ変更する必要があります。
public async void HeavyTask()
↓
public async Task HeavyTask()
もし、非同期でstringの値を返したい場合は、以下のようにTask
public async Task<string> HeavyTask()
{
await Task.Delay( 1000 );
return "hello";
}
そもそも、"async void"と定義されたメソッド自体を定義してはダメです。非同期処理を行う関数を作った場合は戻り値をTask(もしくはTask<T>)にする必要があります。
これは、非同期処理関数の中で例外が発生したときに、呼び元がTaskオブジェクトを保持していないと、呼び元が例外処理を行えないためです。
こちらもおススメ