Czy powinienem unikać obsługi zdarzeń „async void”?
Wiem, że używanie ognia i zapomnienia jest ogólnie złym pomysłemasync void
metody uruchamiania zadań, ponieważ nie ma śladu oczekującego zadania i trudno jest obsługiwać wyjątki, które mogą zostać rzucone do wnętrza takiej metody.
Czy powinienem generalnie unikaćasync void
także obsługa zdarzeń? Na przykład,
private async void Form_Load(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Mogę to przepisać w ten sposób:
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
// ...
}
Jakie są podwodne skały do obsługi asynchronicznych zdarzeń, oprócz możliwości ponownego entrancy?