在C#中,ManualResetEvent类用于实现线程的同步和协调。下面是使用ManualResetEvent类的基本方法:
- 创建一个ManualResetEvent对象:
ManualResetEvent mre = new ManualResetEvent(false); // 初始状态为未发信号
- 等待信号:
mre.WaitOne(); // 阻塞当前线程,直到收到信号
- 发送信号:
mre.Set(); // 发送信号,唤醒等待中的线程
- 重置信号:
mre.Reset(); // 重置信号,设置为未发信号状态
完整示例:
using System; using System.Threading; class Program { static ManualResetEvent mre = new ManualResetEvent(false); static void Main() { Thread t1 = new Thread(DoWork); Thread t2 = new Thread(DoWork); t1.Start(); t2.Start(); Thread.Sleep(2000); // 等待线程启动 mre.Set(); // 发送信号 Thread.Sleep(2000); // 等待线程结束 mre.Reset(); // 重置信号 mre.Set(); // 发送信号 Console.ReadLine(); } static void DoWork() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " Waiting..."); mre.WaitOne(); // 等待信号 Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " Resumed..."); } }
在上述示例中,两个线程t1和t2都会等待收到信号后才会继续执行。调用mre.Set()方法会发送信号,唤醒等待中的线程。调用mre.Reset()方法会重置信号,设置为未发信号状态。