ManualResetEvent:C# 线程同步工具
ManualResetEvent:C# 线程同步工具
- 一、ManualResetEvent是什么
-
- 核心特性:
- 官方文档:
- 适用场景
- 二、实战 Demo
- 三、核心方法速查表
- 四、避坑指南
- 总结
ManualResetEvent:C# 线程同步工具
多线程编程中,线程间的协同往往是绕不开的话题。C#中常使用 ManualResetEvent
来协调同一进程内线程的同步工作
一、ManualResetEvent是什么
ManualResetEvent
是.NET 提供的线程同步原语,基于 EventWaitHandle
实现,核心作用是协调同一进程内多个线程的执行时机。可以通过两种状态控制线程的阻塞与唤醒:
- 终止状态(Signaled):允许等待的线程继续执行
- 非终止状态(Non-Signaled):阻塞等待的线程
核心特性:
- 进程内生效:仅支持同一进程内的线程同步,跨进程同步需使用
EventWaitHandle
- 手动重置:调用
Set()
后,ManualResetEvent
会一直保持“终止状态”,所有等待线程都会被唤醒,直到手动调用Reset()
将其重置为“非终止状态” - 多线程唤醒:一次信号可以唤醒所有等待线程,这与
AutoResetEvent
的“单线程唤醒”形成对比
官方文档:
- ManualResetEvent:ManualResetEvent
- AutoResetEvent:AutoResetEvent
- EventWaitHandle:EventWaitHandle
适用场景
- 屏障同步:多个线程需要等待某个条件成立后同时继续执行,如所有子任务准备好后统一启动
- 阶段性控制:某些阶段,允许所有线程通过,阶段结束后再阻塞后续线程
二、实战 Demo
- 下面的例子模拟了 “主线程准备数据→通知工作线程执行” 的场景,展示了
ManualResetEvent
的核心用法:
using System;
using System.Threading;
using System.Threading.Tasks;namespace ManualResetEventDemo
{internal class Program{static void Log(