「async void」イベントハンドラーは避けるべきでしょうか? 質問する

「async void」イベントハンドラーは避けるべきでしょうか? 質問する

タスクを開始するためにfire-and-forget メソッドを使用するのはasync void、保留中のタスクを追跡できず、そのようなメソッド内でスローされる可能性のある例外を処理するのが難しいため、一般的には悪い考えだと考えられていることは承知しています。

async void一般的にイベント ハンドラーも避けるべきでしょうか?例えば、

private async void Form_Load(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 

次のように書き直すことができます:

Task onFormLoadTask = null; // track the task, can implement cancellation

private void Form_Load(object sender, System.EventArgs e)
{
        this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
} 

private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
        await Task.Delay(2000); // do async work
        // ...
} 

非同期イベント ハンドラーにとって、再入可能性以外に問題となるものは何でしょうか。

ベストアンサー1

ガイドラインは避けることですasync void を除外するイベント ハンドラー内で使用される場合、async voidイベント ハンドラー内で使用しても問題ありません。

とはいえ、ユニットテストasync void私はよくすべての方法のロジックを分解するのが好きです。例えば、

public async Task OnFormLoadAsync(object sender, EventArgs e)
{
  await Task.Delay(2000);
  ...
}

private async void Form_Load(object sender, EventArgs e)
{
  await OnFormLoadAsync(sender, e);
}

おすすめ記事