ManualResetEvent
是 C# 中用于線程同步的一個類。它允許一個或多個線程等待,直到另一個線程設置事件。ManualResetEvent
有兩種狀態:Set
和 Reset
。當事件處于 Set
狀態時,等待的線程會被釋放;當事件處于 Reset
狀態時,線程需要繼續等待。
下面是一個使用 ManualResetEvent
實現線程同步的示例:
using System;
using System.Threading;
class Program
{
static ManualResetEvent _event = new ManualResetEvent(false); // 創建一個初始值為 false 的 ManualResetEvent
static void Main(string[] args)
{
Thread thread1 = new Thread(DoWork);
Thread thread2 = new Thread(DoWork);
thread1.Start();
thread2.Start();
// 讓線程1完成工作后設置事件
_event.Set();
thread1.Join();
thread2.Join();
}
static void DoWork()
{
Console.WriteLine("線程1開始工作...");
// 等待事件被設置
_event.WaitOne();
Console.WriteLine("線程1繼續工作...");
Console.WriteLine("線程1完成工作...");
}
}
在這個示例中,我們創建了兩個線程 thread1
和 thread2
,它們都執行 DoWork
方法。在 DoWork
方法中,我們使用 _event.WaitOne()
讓線程等待事件被設置。在 Main
方法中,我們首先啟動兩個線程,然后在適當的時候調用 _event.Set()
設置事件,以便線程可以繼續執行。
需要注意的是,ManualResetEvent
在使用完后應該被釋放。你可以在程序結束時調用 _event.Dispose()
方法來釋放事件。在上面的示例中,我們在 thread1
和 thread2
都完成后調用了 Join()
方法,確保主線程在所有子線程完成后才退出。這樣可以避免因為子線程仍在運行而導致資源無法釋放的問題。