Я знаю, що загалом вважається поганою ідеєю використовувати 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
// ...
}
Які є підводні скелі для асинхронних обробників подій, окрім можливої повторної участі?