我知道使用即弃即用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
// ...
}
除了可能重新进入之外,异步事件处理程序还有哪些水下岩石?
您应该但不能。除此之外,UI事件处理程序已经要求您在使用异步void时必须采取的所有措施。
—
Paulo Morgado
而重入发生的原因是事件处理程序触发了异步操作,而不是由于本身未使用async-await。
—
Paulo Morgado