0

0

c# SemaphoreSlim.WaitAsync 和 Wait 的区别

月夜之吻

月夜之吻

发布时间:2026-01-28 12:51:09

|

294人浏览过

|

来源于php中文网

原创

WaitAsync 是异步等待、不阻塞线程,支持 CancellationToken 和 async 链式调度;Wait 是同步等待、阻塞线程,仅适用于纯同步上下文,不响应即时取消,混用易致死锁或性能下降。

c# semaphoreslim.waitasync 和 wait 的区别

WaitAsyncWait 的本质区别:线程是否被阻塞

WaitAsync 是异步等待,不阻塞当前线程;Wait 是同步等待,会直接阻塞调用线程。这是最根本的差异,决定了你该用哪一个。

  • async 方法里,必须用 WaitAsync —— 否则会卡死线程池,尤其在 ASP.NET Core 或高并发后台任务中极易引发吞吐下降甚至死锁
  • Wait 适合纯同步上下文(如控制台主流程、单元测试 setup),但一旦混入 await 就会出问题:它不能和 await 共存于同一作用域,也不支持 CancellationToken 的响应式取消(除非用重载 Wait(Int32, CancellationToken),但仍是阻塞)
  • WaitAsync 天然支持 CancellationToken,且返回 Task,可参与 async 链式调度,比如:await semaphore.WaitAsync(ct).ConfigureAwait(false)

为什么 WaitAsync 在高并发下更安全?

因为它的等待是“挂起任务”而非“挂起线程”。当许可不足时,WaitAsync 内部用 TaskCompletionSource 暂停当前 Task,把线程还给线程池;而 Wait 会让线程原地休眠(可能触发内核态等待),白白占用一个线程资源。

  • 1000 个并发请求,每个都 Wait 3 秒 → 可能瞬间耗尽默认线程池(约 1000 线程),造成后续请求排队或超时
  • 同样场景用 WaitAsync → 实际只占用几十个线程,其余任务处于“挂起”状态,内存开销小、调度灵活
  • 注意:WaitAsync 并非零成本 —— 它仍需原子操作维护内部计数器 _currentCount,竞争激烈时可能退化为内核等待(如 Windows 下触发 WaitForSingleObject

常见误用:在 lock 或同步方法里调用 WaitAsync

这不会报错,但完全失去异步意义,且容易埋雷:

网钛淘拍CMS(TaoPaiCMS) V1.60
网钛淘拍CMS(TaoPaiCMS) V1.60

2013年07月06日 V1.60 升级包更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。1.[新增]后台引导页加入非IE浏览器提示,后台部分功能在非IE浏览器下可能没法使用2.[改进]淘客商品管理 首页 列表页 内容页 的下拉项加入颜色来区别不同项3.[改进]后台新增/修改淘客商品,增加淘宝字样的图标和天猫字样图标改成天猫logo图标4.[改进]为统一名称,“分类”改

下载
public void BadExample()
{
    // ❌ 错误:在同步方法里 await WaitAsync,编译不过(缺少 async)
    // 即使强行改成 async void,也会导致异常无法捕获、生命周期失控
    semaphore.WaitAsync().Wait(); // 更糟:.Wait() 强制同步等待,抵消了 WaitAsync 的优势
}
  • 不要对 WaitAsync 调用 .Wait().Result —— 这等于把异步转回同步,还多一层死锁风险(尤其在 UI 或 ASP.NET 同步上下文)
  • 若必须从同步入口进入,优先考虑重构为异步链路;迫不得已才用 WaitAsync(timeoutMs).GetAwaiter().GetResult(),并确保 timeout 设置合理
  • Wait 本身可安全用于同步方法,但要注意:它不响应 CancellationToken 的“即时取消”,只能靠超时参数

性能与兼容性:选 SemaphoreSlim 就别回头用 Semaphore

SemaphoreSlim.WaitAsync 是 .NET 4.5+ 引入的现代方案,而 Semaphore 根本没有 WaitAsync 方法 —— 它是纯内核对象,只支持 WaitOne

  • 如果你需要跨进程同步(如多个 exe 共享资源),只能用 Semaphore,但必须接受无异步、性能低、不能用于 async 方法
  • SemaphoreSlim 不支持命名,仅限单进程;但它支持 WaitAsync、轻量、可取消、可配置自旋等待(构造时传 spinBeforeWait 参数)
  • 别试图混合使用:比如用 SemaphoreSlim 发布许可,却用 Semaphore.WaitOne 等待 —— 它们互不识别,毫无关系
真正关键的不是“哪个更好”,而是“你的调用上下文是否允许阻塞”。async 方法里写 Wait,就像在高速路上突然停车;同步方法里滥用 WaitAsync + .Wait(),等于把电梯改成楼梯再爬上去。信号量本身很简单,难的是让它和你的执行模型对齐。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

503

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

762

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1129

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

800

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2354

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

823

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1626

2023.08.28

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Excel 教程
Excel 教程

共162课时 | 13.9万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

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

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