Eu sei que geralmente é considerado uma má ideia usar async void
métodos de disparar e esquecer para iniciar tarefas, porque não há controle da tarefa pendente e é complicado lidar com exceções que podem ser lançadas dentro de tal método.
Em geral, devo evitar async void
manipuladores de eventos também? Por exemplo,
private async void Form_Load(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Posso reescrever assim:
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
// ...
}
Quais são as rochas subaquáticas para manipuladores de eventos assíncronos, além da possível reentrância?