讲师中心 微信公众号
AI工具推荐 视频效率加速

C# Monitor类使用方法 C# Monitor.Wait和Pulse如何实现线程通信

落伟小哥_3191

落伟小哥_3191

发布时间:2026-03-08 12:12:11

|

658人浏览过

|

来源于php中文网

原创

Monitor.Wait 必须在 lock 块内调用,否则抛出 SynchronizationLockException;它会释放锁并挂起线程,唤醒后需重新竞争锁;必须用 while 循环检查条件,配合状态变量和 Pulse/PulseAll 正确使用。

c# monitor类使用方法 c# monitor.wait和pulse如何实现线程通信

Monitor.Wait 必须在 lock 块内调用,否则抛出 SynchronizationLockException

这是最常踩的坑:Monitor.Wait 不是“随便等一下”,它本质是释放当前线程持有的锁、挂起自己,并等待被唤醒。如果没持有锁就调用,运行时直接报 SynchronizationLockException。

正确姿势是:先用 lock(obj) 或 Monitor.Enter 获取锁,再调用 Monitor.Wait;它内部会自动释放该锁,并在被 Pulse 或 PulseAll 唤醒后、重新竞争获取同一把锁——注意,不是立刻恢复执行,而是要再次抢到锁才能继续往下走。

  • 错误示例:Monitor.Wait(someObj) 单独写在外面 → 立即崩溃
  • 正确结构:lock (someObj) { Monitor.Wait(someObj); }
  • 若用 Monitor.Enter 手动加锁,必须配对 try/finally + Monitor.Exit,否则异常时锁不释放

Monitor.Pulse 只唤醒一个等待线程,且只对“已进入 Wait 队列”的线程有效

Monitor.Pulse 不是广播,也不保证唤醒谁。它只从当前对象的 wait queue 中挑一个线程(通常是等待最久的那个)移到 ready queue,让其有机会重新竞争锁。关键点在于:“Pulse 之前没有 Wait” = 白脉冲,什么也不会发生。

典型误用是生产者先 Pulse、消费者后 Wait,结果消费者永远卡住。因为 Pulse 发生时没人等着,信号丢失了。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 必须严格遵循“先 Wait,后 Pulse”顺序(或至少确保 Wait 已启动)
  • 若需唤醒所有等待者,改用 Monitor.PulseAll,比如多个消费者争抢同一资源
  • Pulse 调用本身不要求持有锁?错!它也必须在 lock 块内,否则同样抛 SynchronizationLockException

Wait/Pulse 组合常用于“生产者-消费者”场景,但需配合状态变量判断条件

Monitor.Wait 和 Pulse 本身不传递数据、也不校验业务逻辑。它们只是线程调度开关,真正决定“该不该等”“该不该醒”的,是你自己维护的状态变量(如队列是否为空、缓冲区是否满)。

常见错误是裸调 Wait,不检查条件,导致虚假唤醒(spurious wakeup)或逻辑错乱。.NET 的 Wait 设计允许唤醒后条件仍未满足,所以必须用 while 循环重检。

lock (queueLock)
{
    while (messageQueue.Count == 0)
    {
        Monitor.Wait(queueLock);
    }
    var msg = messageQueue.Dequeue();
}
  • 永远用 while 包裹 Wait,不用 if
  • 状态变量(如 Count)必须在同一个锁保护下读写,否则有竞态
  • Pulse 方通常在修改完状态后立即调用,例如 Enqueue 后 Monitor.Pulse

Wait 可带超时,避免永久阻塞;但超时返回 false 不代表错误,只是“没等到”

Monitor.Wait(object, int) 和 Monitor.Wait(object, TimeSpan) 允许指定最大等待时间。超时后方法返回 false,线程恢复执行,但锁依然被持有(因为 Wait 是在 lock 块里释放并重入的)。

这适合做轮询、防死锁、或实现带截止时间的任务调度。但要注意:返回 false 是正常流程分支,不是异常,不应直接 throw。

  • 超时后需手动检查状态是否满足,不满足可 continue 等下一轮,或 break 处理超时逻辑
  • 超时值设太小会导致频繁空转,太大则响应延迟高;建议结合业务容忍度设定
  • 不要在 Wait 超时后忘记处理未完成的业务路径(比如连接未建立就继续发请求)
实际用起来最难的从来不是语法,而是状态同步的边界和唤醒时机的确定——多一个 Pulse、少一个 Wait、漏一次状态检查,都可能让线程卡在某个角落,日志里还看不出明显错误。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

1132

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

3371

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

945

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2655

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

352

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

429

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

631

2026.03.11

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

329

2026.04.13

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn