在C#中,ManualResetEvent是一個線程同步的工具,用于控制多線程之間的同步操作。下面是ManualResetEvent的基本用法:
ManualResetEvent mre = new ManualResetEvent(false);
這里的參數false表示初始狀態為非終止狀態,即阻塞線程。
mre.WaitOne();
當線程執行到這里時,如果ManualResetEvent的狀態是非終止狀態,則線程會被阻塞,直到ManualResetEvent收到信號。
mre.Set();
當某個線程調用Set()方法后,ManualResetEvent的狀態變為終止狀態,并且所有正在等待的線程會被喚醒。
mre.Reset();
調用Reset()方法將ManualResetEvent的狀態重置為非終止狀態。
需要注意的是,ManualResetEvent可以在多個線程之間進行同步操作。如果有多個線程在等待ManualResetEvent的信號,當ManualResetEvent收到信號后,所有等待的線程都會被喚醒。此外,ManualResetEvent還提供了一個WaitOne方法的重載版本,可以指定等待的超時時間。
下面是一個示例,演示了如何使用ManualResetEvent實現線程的同步操作:
class Program
{
static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(string[] args)
{
Thread t1 = new Thread(Worker1);
Thread t2 = new Thread(Worker2);
t1.Start();
t2.Start();
Thread.Sleep(2000); // 等待一段時間
mre.Set(); // 發送信號給等待的線程
Console.ReadKey();
}
static void Worker1()
{
Console.WriteLine("Worker1開始等待...");
mre.WaitOne(); // 等待信號
Console.WriteLine("Worker1收到信號,繼續執行...");
}
static void Worker2()
{
Console.WriteLine("Worker2開始等待...");
mre.WaitOne(); // 等待信號
Console.WriteLine("Worker2收到信號,繼續執行...");
}
}
在上面的示例中,Worker1和Worker2線程都會等待ManualResetEvent的信號。在Main方法中,我們等待一段時間后通過mre.Set()方法發送信號給等待的線程。然后Worker1和Worker2線程會被喚醒并繼續執行后續的代碼。