简介:
在 C# 中,ManualResetEvent 是一个用于线程同步的类,属于 System.Threading 命名空间。它允许一个或多个线程等待某个信号(事件),直到其他线程显式触发该信号为止。与 AutoResetEvent 不同,ManualResetEvent 在触发后会保持信号状态,直到手动重置。
信号状态:
- 有信号(Signaled):所有调用 WaitOne() 的线程不会被阻塞。
- 无信号(Non-signaled):所有调用 WaitOne() 的线程会被阻塞,直到调用 Set()。
基本用法:
- initialState:初始化是否为有信号状态(true 表示有信号/或称 已触发,则线程一开始是无需等待信号的)。
var manualEvent = new ManualResetEvent(initialState: false); // 初始无信号
- 关键方法:
| 方法 | 作用 |
|---|---|
| Set() | 将事件设为有信号状态,释放所有等待线程。 |
| Reset() | 将事件设为无信号状态,后续的 WaitOne() 会阻塞。 |
| WaitOne() | 阻塞当前线程,直到事件变为有信号状态。可以指定超时时间 |
| Dispose() | 释放资源(继承自 WaitHandle)。 |
示例:
private static ManualResetEvent manualEvent = new ManualResetEvent(false);
private void TestManualResetEvent()
{
Thread worker = new Thread(DoWork);
worker.Start();
// 主线程触发信号
Thread.Sleep(10000);
Console.WriteLine("主线程发送信号");
manualEvent.Set(); // 释放工作线程
}
private void DoWork()
{
Console.WriteLine("工作线程等待信号...");
bool b = manualEvent.WaitOne(); // 阻塞直到信号触发
//bool b = manualEvent.WaitOne(1000); // 阻塞直到信号触发或1秒后才往下执行
// 返回的是信号的状态
Debug.WriteLine(b);
Console.WriteLine("工作线程继续执行");
}