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