C# .NET Core 5 WinForm中异步方法加/不加await的表现是否正常?
问题结论
你观察到的运行表现完全是C# async/await的正常行为,现有加await的写法符合WinForm异步事件处理的规范,只有小部分可以优化的空间。
行为原理解释
await关键字的核心作用就是暂停当前方法的执行流,等待目标异步任务执行完成后,才会继续执行await之后的代码。你添加await调用TaskAsync()时,点击事件会等待方法内部的2秒延迟完全执行完毕,才会走到MessageBox.Show逻辑,因此会出现2秒延迟后才弹框的表现。- 去掉
await直接调用TaskAsync()时,你只是触发了异步任务的执行,不会等待它运行完成,点击事件会直接向下执行后续逻辑,因此会立刻弹出消息框,这种调用方式也叫「火并忘记(Fire and Forget)」。
写法优化建议
- 你当前给按钮点击事件加
await的写法是WinForm异步事件的标准实现,完全符合要求:事件处理器本身的返回值约定为void,因此async void的用法是合理的,注意除了事件处理器之外的其他异步方法不要用async void,统一返回Task/Task<TResult>即可。 - 你的
TaskAsync方法存在不必要的性能开销:Task.Delay本身已经返回可直接等待的Task对象,不需要额外嵌套Task.Run调度线程池,优化后写法如下:
private async Task TaskAsync() { await Task.Delay(2000); }
- 如果你使用无
await的火并忘记调用方式,要注意风险:如果TaskAsync运行过程中抛出未处理异常,你没有等待任务的话将无法捕获该异常,会直接触发程序全局未处理异常导致崩溃,除非你完全不需要关注任务的执行结果和异常,否则不建议去掉await。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

