【发布时间】:2013-10-25 06:56:42
【问题描述】:
我知道使用即发即弃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 事件处理程序已经需要您在使用 async void 时必须注意的所有事项。
-
而重入的发生是因为事件处理程序触发的异步操作,而不是单独使用 async-await。
标签: c# .net events asynchronous async-await