You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET Core 5 WinForm中异步方法加/不加await的表现是否正常?

问题结论

你观察到的运行表现完全是C# async/await的正常行为,现有加await的写法符合WinForm异步事件处理的规范,只有小部分可以优化的空间。


行为原理解释

  • await 关键字的核心作用就是暂停当前方法的执行流,等待目标异步任务执行完成后,才会继续执行await之后的代码。你添加await调用TaskAsync()时,点击事件会等待方法内部的2秒延迟完全执行完毕,才会走到MessageBox.Show逻辑,因此会出现2秒延迟后才弹框的表现。
  • 去掉await直接调用TaskAsync()时,你只是触发了异步任务的执行,不会等待它运行完成,点击事件会直接向下执行后续逻辑,因此会立刻弹出消息框,这种调用方式也叫「火并忘记(Fire and Forget)」。

写法优化建议

  1. 你当前给按钮点击事件加await的写法是WinForm异步事件的标准实现,完全符合要求:事件处理器本身的返回值约定为void,因此async void的用法是合理的,注意除了事件处理器之外的其他异步方法不要用async void,统一返回Task/Task<TResult>即可。
  2. 你的TaskAsync方法存在不必要的性能开销:Task.Delay本身已经返回可直接等待的Task对象,不需要额外嵌套Task.Run调度线程池,优化后写法如下:
private async Task TaskAsync()
{
    await Task.Delay(2000);
}
  1. 如果你使用无await的火并忘记调用方式,要注意风险:如果TaskAsync运行过程中抛出未处理异常,你没有等待任务的话将无法捕获该异常,会直接触发程序全局未处理异常导致崩溃,除非你完全不需要关注任务的执行结果和异常,否则不建议去掉await。

内容的提问来源于stack exchange,提问作者abc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:00:03