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

异步调用中.Result的作用及适用场景是什么?

关于Database.ExecuteSqlRawAsync的.Result用法解析

.Result的作用

Database.ExecuteSqlRawAsync是异步方法,返回Task<int>(代表SQL执行后受影响的行数)。调用.Result的核心作用是同步阻塞当前线程,等待异步任务执行完成,然后直接获取任务的返回值。

和await的核心区别:

  • await会释放当前线程,让它去处理其他任务,等异步操作完成后再回到原上下文继续执行,全程不阻塞线程;
  • .Result则会把当前线程死死占用,直到异步任务结束,期间该线程无法处理其他工作。另外如果异步方法抛出异常,.Result会把异常包装成AggregateException抛出,而await会直接抛出原始异常。

会用到.Result的场景

这种写法属于“迫不得已”的方案,只有在无法使用async/await的同步代码环境下才会考虑:

  • 老旧同步框架的约束:比如维护传统ASP.NET(非Core)项目、WinForms/WPF的同步事件处理方法,或者必须实现第三方库要求的同步接口——这些场景下你没法把方法改成async,只能用.Result来调用异步数据库方法。
  • 早期C#版本的控制台程序:在C# 7.1之前,控制台的Main方法不能标记为async,如果要调用异步方法,只能用.Result(或者.Wait())来阻塞等待任务完成。不过现在主流C#版本都支持异步Main了,这个场景已经很少见。

重要提醒

除非万不得已,绝对优先用await而非.Result。因为在带有同步上下文的环境(比如ASP.NET非Core、UI线程)里,.Result极易导致死锁:异步任务完成后需要回到原上下文继续,但原线程被.Result阻塞住,两边互相等待,程序直接卡死。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:40:38