ManualResetEvent 是 C# 中的一個線程同步類,用于控制多個線程的執行順序。
ManualResetEvent 有兩個狀態:設置和非設置。默認情況下,ManualResetEvent 的狀態為非設置。線程可以通過調用 ManualResetEvent 的 Set() 方法將其狀態設置為設置狀態,也可以調用 Reset() 方法將其狀態設置為非設置狀態。
ManualResetEvent 的兩個主要方法是 WaitOne() 和 Set()。WaitOne() 方法用于阻塞當前線程,直到 ManualResetEvent 的狀態為設置狀態。而 Set() 方法用于將 ManualResetEvent 的狀態設置為設置狀態,并允許等待中的線程繼續執行。
下面是一個使用 ManualResetEvent 的示例:
using System;
using System.Threading;
class Program
{
static ManualResetEvent manualEvent = new ManualResetEvent(false);
static void Main()
{
// 創建兩個線程
Thread t1 = new Thread(DoWork);
t1.Start();
Thread t2 = new Thread(DoWork);
t2.Start();
// 執行一些其他操作
// 等待一段時間后,將 ManualResetEvent 的狀態設置為設置狀態,使得等待中的線程可以繼續執行
Thread.Sleep(2000);
manualEvent.Set();
// 等待兩個線程執行完畢
t1.Join();
t2.Join();
Console.WriteLine("All threads have finished.");
}
static void DoWork()
{
Console.WriteLine("Thread {0} is waiting.", Thread.CurrentThread.ManagedThreadId);
// 阻塞當前線程,直到 ManualResetEvent 的狀態為設置狀態
manualEvent.WaitOne();
Console.WriteLine("Thread {0} continues.", Thread.CurrentThread.ManagedThreadId);
}
}
在上面的示例中,我們創建了兩個線程 t1 和 t2,它們都會執行 DoWork() 方法。在 DoWork() 方法中,我們首先輸出當前線程的 ID,并調用 manualEvent 的 WaitOne() 方法來阻塞線程。然后,在主線程中等待一段時間后,調用 manualEvent 的 Set() 方法將其狀態設置為設置狀態,從而使得等待中的線程可以繼續執行。最后,我們使用 t1.Join() 和 t2.Join() 方法來等待兩個線程執行完畢。
通過這個示例,我們可以看到 ManualResetEvent 的使用方式:在需要等待某些條件滿足時,調用 WaitOne() 方法來阻塞線程,然后通過調用 Set() 方法來喚醒等待中的線程。這樣,我們就可以控制多個線程的執行順序。