[C#]非同期の関数の呼び出しで、エラー「CS4008 'void'を待機することができません」が出るときにすること

カテゴリ: C# | タグ:

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オブジェクトを保持していないと、呼び元が例外処理を行えないためです。


Amazonでおトクに買い物する方法
AmazonチャージでポイントGET


Amazonは買いもの前にAmazonギフト券をチャージしてポイントをゲットしないと損!

こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です