タスクを開始するために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);
}