NET 异步用法不当【常见风险+错误案例+正确写法】 NET 异步用法不当【常见风险错误案例正确写法】所有案例均贴合 酒店CRS/OTA同步/订单库存 真实业务是线上最容易出Bug、崩溃、死锁、超时的场景。风险一异步方法用 .Result / .Wait() 死锁最高频线上事故场景在 Api/Controller 同步方法中强行阻塞获取异步结果错误代码线上必死锁// 同步方法调用异步、强行阻塞publicstringGetOrderInfo(intorderId){// 致命问题阻塞主线程 同步上下文争抢 永久死锁varresGetOrderInfoAsync(orderId).Result;returnres;}publicasyncTaskstringGetOrderInfoAsync(intorderId){awaitTask.Delay(100);// 内部await需要切回主线程return订单查询成功;}风险危害Web项目 100%死锁接口卡死不响应线程池线程全部被堵死后续所有接口超时集群服务雪崩、OTA同步大面积失败正确写法// 全程异步到底publicasyncTaskstringGetOrderInfo(intorderId){returnawaitGetOrderInfoAsync(orderId);}风险二async 方法不带 await假异步、同步卡死场景方法标了async内部全是同步代码或者漏写await错误代码坑极多// 假异步没有任何await本质还是同步执行publicasyncTaskSyncUpdateStock(){// 数据库同步查询、循环计算库存QueryDB();CalcStock();}风险危害不会释放线程完全不提升并发报错堆栈错乱、异常捕获不准酒店高并发下单时线程阻塞、接口抖动正确写法publicasyncTaskSyncUpdateStock(){awaitQueryDBAsync();awaitCalcStockAsync();}风险三异步方法 void 返回无法捕获异常、静默崩溃场景后台任务、日志记录、OTA消息推送用 async void错误代码// 致命async void 异常无法被全局捕获publicasyncvoidSaveOrderLog(intorderId){// 一旦报错直接进程崩溃、无日志、无重试await_db.SaveLogAsync(orderId);}风险危害异步内部报错 直接抛进程级异常try-catch 拦不住、全局异常过滤器拦不住酒店订单日志丢失、OTA同步失败无记录客诉无法排查正确写法// 统一返回Task让框架托管异常publicasyncTaskSaveOrderLog(intorderId){await_db.SaveLogAsync(orderId);}风险四await 不等待、直接丢 Task异步乱序、数据错乱场景批量同步房态、批量更新订单偷懒不写await错误代码酒店项目高频BugpublicasyncTaskBatchUpdateRoomStatus(){// 没有await直接放行任务后台乱跑UpdateRoomStatusAsync(1001);UpdateRoomStatusAsync(1002);// 主流程提前结束异步任务还在跑return;}风险危害执行乱序、先后不确定订单状态、房态数据错乱、超卖、锁房失效请求结束后异步任务继续执行出现“脏更新”正确写法串行/并行可控// 串行等待awaitUpdateRoomStatusAsync(1001);awaitUpdateRoomStatusAsync(1002);// 并行批量推荐批量同步vartasksnewListTask(){UpdateRoomStatusAsync(1001),UpdateRoomStatusAsync(1002)};awaitTask.WhenAll(tasks);风险五嵌套 await 不做幂等 无超时接口雪崩场景CRS调用PMS、OTA回调、多级异步嵌套错误代码// 多级异步嵌套、无超时、无重试、无幂等publicasyncTaskOtaSync(){// 下游接口超时会卡主线程varorderawaitGetOtaOrderAsync();awaitSaveOrderAsync(order);}风险危害下游接口抖动导致上游所有异步链路阻塞堆积无超时 → 线程池耗尽、服务雪崩重复请求导致订单重复创建、重复扣款正确写法带超时幂等// 超时控制避免无限阻塞vartaskGetOtaOrderAsync();varresawaitTask.WhenAny(task,Task.Delay(3000));if(res!task)thrownewTimeoutException(OTA同步超时);**总结五大异步错误 一句话风险**Result/Wait()同步上下文死锁服务雪崩有async无await假异步不释放线程无并发提升async void异常无法捕获静默崩溃、日志丢失丢Task不await执行乱序、业务数据错乱无超时无幂等嵌套异步链路阻塞、高并发雪崩