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?

questionAnswers(4)

yourAnswerToTheQuestion