在C#中,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()方法会重置信号,设置为未发信号状态。