我知道通常认为使用启动和忘记 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
// ...
}
除了可能的重入之外,异步事件处理程序的水下岩石是什么?