.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
相关产品推荐
相关产品推荐

