ManualResetEventSlim 在短等待(通常

ManualResetEventSlim 比 ManualResetEvent 快多少?
在绝大多数短等待(ManualResetEventSlim 的吞吐量可比 ManualResetEvent 高 3–10 倍;但一旦等待时间超过几毫秒,两者性能差距迅速收窄,甚至反超——因为 ManualResetEventSlim 会自动退化为内部调用 ManualResetEvent(即“自旋 + 落地”策略)。这不是 bug,是设计使然。
- 构造开销:两者几乎无差别,都是托管对象,不涉及内核句柄分配
- 短时等待(如锁争用、快速信号通知):
ManualResetEventSlim优先自旋(busy-wait),避免线程挂起/唤醒的调度开销 - 长时等待(如 IO 等待、不确定延迟):
ManualResetEventSlim在自旋一定次数(默认 ~10 微秒或 10 次循环)后,会 fallback 到内核事件等待,此时性能 ≈ManualResetEvent - 跨进程?不行。
ManualResetEventSlim仅限单进程内使用;ManualResetEvent可通过EventWaitHandle底层支持命名句柄,实现跨进程同步
什么时候该选 ManualResetEventSlim?
选它,不是因为它“更现代”,而是你明确知道:等待时间极短、线程数可控、且不需要跨进程能力。
- ✅ 典型适用:生产者-消费者队列中“唤醒消费者线程”的轻量信号、异步状态机中的阶段切换、单元测试中模拟同步点
- ❌ 不该用:等待文件 IO 完成、等待网络响应、需被其他进程观察的信号(比如 Windows 服务间通信)
- ⚠️ 注意:若高并发下大量线程同时调用
WaitOne(),ManualResetEventSlim的自旋可能抬高 CPU 使用率——这不是卡死,是设计代价
Reset() 和 Set() 行为一致吗?
完全一致。两者都遵循 Manual Reset 语义:一次 Set() 可唤醒所有等待线程,且信号持续有效,直到显式调用 Reset()。
创想C2C商城系统,系统功能仿照淘宝设计,采用模块标签技术和静态html生成技术 基于Asp.Net/C#+SQL的开发的创想多用户商城系统,具有智能化、高扩展、稳定安全等特性,后台可自由添加频道,自由修改界面风格,商品无限级 分类,支持在线支付整合,通过安装和使用创想C2C商城系统,就可以轻松建立起专业大型的网上交易平台。创想C2C多用户商城系统5.6.3.8版本升级功能1.网站地区设置功能的增
-
new ManualResetEvent(false)和new ManualResetEventSlim(false)初始化效果相同:首次WaitOne()阻塞 -
new ManualResetEvent(true)和new ManualResetEventSlim(true)同样跳过首次等待 -
区别只在底层实现路径,不影响业务逻辑行为 —— 这意味着你可以把
ManualResetEvent替换为ManualResetEventSlim,只要不依赖跨进程或长期阻塞
static void ExampleUsage()
{
var mres = new ManualResetEventSlim(false);
var t = new Thread(() =>
{
Console.WriteLine("Thread waiting...");
mres.WaitOne(); // 短等待 → 自旋;长等待 → 落地为内核等待
Console.WriteLine("Thread resumed.");
});
t.Start();
Thread.Sleep(10);
mres.Set(); // 唤醒
t.Join();
}
真正容易忽略的点是:别为了“听起来更轻量”而盲目替换。如果你的 WaitOne() 平均耗时 > 5ms,或者压根没测过等待分布,那 ManualResetEventSlim 可能只是多了一层不必要的自旋开销,还失去调试可见性(比如无法用 Windows 性能分析器直接看到命名事件句柄)。性能优化,永远从测量开始,而不是从类名开始。










