ManualResetEventSlim:C# 线程同步工具
ManualResetEventSlim:C# 线程同步工具
- 一、ManualResetEventSlim是什么
-
- 核心特性:
- 官方文档:
- 二、实战 Demo
- 三、核心方法速查表
- 四、避坑指南
- 总结
ManualResetEventSlim:C# 线程同步工具
多线程编程中,线程间的协同往往是绕不开的话题。C#中常使用 ManualResetEventSlim
来协调同一进程内线程的同步工作
一、ManualResetEventSlim是什么
ManualResetEventSlim
是.NET 提供的一个轻量级的线程同步原语,核心作用是协调同一进程内多个线程的执行时机。类似于传统的 ManualResetEvent,但在短时间等待的情况下性能更高。可以通过两种状态控制线程的阻塞与唤醒:
- 终止状态(Signaled):允许等待的线程继续执行
- 非终止状态(Non-Signaled):阻塞等待的线程
核心特性:
- 多线程唤醒:一次信号可以唤醒所有等待线程,这与 AutoResetEvent 的“单线程唤醒”形成对比
- 进程内生效:仅支持同一进程内的线程同步,跨进程同步需使用 EventWaitHandle
- 手动重置:调用 Set() 后,会一直保持“终止状态”,所有等待线程都会被唤醒,直到手动调用 Reset() 将其重置为“非终止状态”
- 轻量级实现:主要基于用户态自旋,等待时间短时不会立即切换到内核态,减少线程切换开销,性能优于 ManualResetEvent
- 信号状态可查询:提供 IsSet 属性,可直接判断事件当前是否为已设置(signaled)状态
- 自旋次数可配置:构造函数可指定自旋次数控制在用户态的时长(推荐使用默认值)
官方文档:
- AutoResetEvent:AutoResetEvent
- ManualResetEvent:ManualResetEvent
- ManualResetEventSlim:ManualResetEventSlim
- EventWaitHandle:EventWaitHandle
二、实战 Demo
- 下面的例子模拟了 “主线程准备数据→通知工作线程执行” 的场景,展示了 ManualResetEventSlim的核心用法:
using System;
using System.Threading;
using System.Threading.Tasks;namespace ManualResetEventSlimDemo
{internal class