一尘不染

我应该避免使用“异步无效”事件处理程序吗?

c#

我知道使用即弃即用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
        // ...
}

除了可能重新进入之外,异步事件处理程序还有哪些水下岩石?


阅读 231

收藏
2020-05-19

共1个答案

一尘不染

指导原则是避免在事件处理程序中使用时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);
}
2020-05-19