You need to enable JavaScript to run this app. .NET Core控制台应用中C# async/await修饰符的正确用法咨询
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core控制台应用中C# async/await修饰符的正确用法咨询

结论

你当前的写法语法上可以在.NET Core控制台中正常运行,但完全不符合async/await的最佳实践,没有发挥异步编程的优势,还存在潜在风险。

存在的问题

  • 用Wait()阻塞主线程:异步方法的核心优势是IO等待时释放线程处理其他任务,Wait()会强制卡住线程等待任务完成,相当于把异步代码硬生生改成同步执行,完全浪费了async/await的价值
  • 异常处理成本高:Wait()抛出的异常会被封装为AggregateException,你需要手动拆解内层异常才能定位真实问题,调试和异常捕获都非常麻烦
  • 死锁隐患:虽然控制台应用默认没有同步上下文,你这段代码大概率不会触发死锁,但如果后续代码移植到有同步上下文的环境(比如WPF、WinForm、ASP.NET Framework),这种Wait()+内部await的写法会100%触发死锁,属于非常不推荐的编码习惯
  • 没有利用并发能力:你当前两个任务是串行执行的,必须等第一个任务完全结束才会启动第二个,如果两个任务没有业务依赖,完全可以并行执行提升效率

最优写法

1. 异步串行执行(保留你原来的先后执行顺序)

.NET Core 2.0及以上版本原生支持async Task类型的Main入口点,直接用await即可:

static async Task Main(string[] args)
{
  //...

  await MyTask_1_RunAsync(dbConnectionString);
  await MyTask_2_RunAsync(dbConnectionString);  

  //...
}

2. 异步并行执行(两个任务无依赖时推荐)

如果两个任务没有先后顺序要求,用Task.WhenAll同时启动两个任务,等待全部完成即可,能大幅缩短整体执行时间:

static async Task Main(string[] args)
{
  //...
  await Task.WhenAll(
    MyTask_1_RunAsync(dbConnectionString), 
    MyTask_2_RunAsync(dbConnectionString)
  );
  //...
}

内容的提问来源于stack exchange,提问作者Md. Salahuddin Ahamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:57:02