我知道使用即弃即用async void方法启动任务通常被认为是一个坏主意,因为没有跟踪待处理任务的信息,并且处理此类方法中可能引发的异常非常棘手。
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 // ... }
除了可能重新进入之外,异步事件处理程序还有哪些水下岩石?
指导原则是避免在事件处理程序中使用时async void 除外 ,因此async void在事件处理程序中使用是可以的。
就是说,出于 单元测试的 原因,我经常喜欢排除所有async void方法的逻辑。例如,
public async Task OnFormLoadAsync(object sender, EventArgs e) { await Task.Delay(2000); ... } private async void Form_Load(object sender, EventArgs e) { await OnFormLoadAsync(sender, e); }