0

0

c# C# 异步编程的 "Don't block on async code" 原则

月夜之吻

月夜之吻

发布时间:2026-01-21 13:16:02

|

358人浏览过

|

来源于php中文网

原创

GetAwaiter().GetResult() 是最常踩的坑,因它看似同步实则阻塞线程且易致死锁,尤其在 UI 或 ASP.NET 同步上下文中;不释放上下文、不支持取消、异常难追踪,仅适用于无同步上下文的控制台主函数或单元测试。

c# c# 异步编程的 \

为什么 GetAwaiter().GetResult() 是最常踩的坑

它看起来像同步调用,实际会阻塞当前线程并可能引发死锁——尤其在 UI 线程或 ASP.NET 同步上下文里。比如在 WinForms 事件处理器中写 var result = SomeAsyncMethod().GetAwaiter().GetResult();,UI 线程被占住,而异步操作内部又尝试回调到该线程,直接卡死。

  • 它不释放上下文,也不支持取消,错误堆栈也难追踪
  • .Result 行为一致,但后者还可能包装 AggregateException,更难调试
  • 仅适合极少数场景:控制台主函数入口、单元测试 setup(且需确保无同步上下文)

ASP.NET Core 中 async void 为什么比 async Task 更危险

async void 方法无法被等待,异常会直接抛给 SynchronizationContext,导致进程崩溃或静默丢失;而 ASP.NET Core 默认没有全局异常处理器捕获这类异常。

  • 控制器动作方法必须返回 TaskTask,返回 void 会绕过框架的请求生命周期管理
  • 事件处理(如 Button.Click += async void (...) {...})在 WebAssembly 或 Blazor Server 中同样不可靠
  • 日志里看不到未捕获异常,监控也收不到,问题暴露滞后

如何安全地“同步等待”一个 Task(真有这需求时)

绝大多数情况不该这么做。但如果集成旧代码、测试断言或极简 CLI 工具,且明确知道运行环境无同步上下文(如 .NET 6+ 控制台应用),可用以下方式:

问小白
问小白

免费使用DeepSeek满血版

下载
var task = SomeAsyncMethod();
task.Wait(); // 比 GetResult() 稍好:异常原样抛出,不包 AggregateException
// 或更稳妥:
task.ConfigureAwait(false).GetAwaiter().GetResult(); // 显式放弃上下文捕获
  • ConfigureAwait(false) 是关键,它告诉编译器“别试图回到原始上下文”,避免死锁
  • 仍要配合 try/catch 处理 TaskCanceledException 和业务异常
  • 永远不要在库代码中暴露同步包装方法(如 DoSomething() + DoSomethingAsync()),这会把阻塞风险传递给调用方

Task.Run(() => { ... }).Result 真的安全吗?

不安全。它只是把同步阻塞移到了线程池线程上,看似没卡主线程,实则浪费线程资源、增加调度开销,并可能引发线程池饥饿——尤其高并发场景下大量 Task.Run(...).Result 会拖垮整个应用吞吐。

  • 它不是“异步转同步”的正确解法,而是用资源换表象
  • 若原方法本就 CPU 密集,应改用 Task.Run + await,而不是 .Result
  • ASP.NET Core 中禁止在请求处理路径里调用它,中间件或过滤器里出现会被诊断工具标记为高风险
真正棘手的从来不是语法怎么写,而是判断「这个调用链里有没有同步上下文」「下游是否支持取消」「异常传播路径是否可控」——这些没法靠加个 await 就自动解决。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

1

2026.01.21

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

22

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

29

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

170

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

125

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

14

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号