c# ManualResetEventSlim 和 ManualResetEvent 的性能区别

ManualResetEventSlim 在短等待(通常

c# manualreseteventslim 和 manualresetevent 的性能区别

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多用户商城系统

创想C2C多用户商城系统

创想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 性能分析器直接看到命名事件句柄)。性能优化,永远从测量开始,而不是从类名开始。

https://www.php.cn/faq/1973157.html

发表回复

Your email address will not be published. Required fields are marked *