ManualResetEvent
是 C# 中的一個同步原語,用于控制多個線程對共享資源的訪問。它有兩種狀態:Set
和 Reset
。
ManualResetEvent
的狀態為 Set
時,表示事件已經被觸發,等待的線程可以繼續執行。一旦一個線程調用了 Set
方法,事件就會保持 Set
狀態,直到另一個線程調用 Reset
方法將其重置為 Reset
狀態。ManualResetEvent
的狀態為 Reset
時,表示事件尚未觸發,等待的線程需要繼續等待。調用 Reset
方法會將事件的狀態從 Set
改為 Reset
,直到另一個線程調用 Set
方法將其設置為 Set
狀態。管理 ManualResetEvent
狀態的關鍵是正確地使用 Set
和 Reset
方法。以下是一些示例代碼:
// 創建一個 ManualResetEvent 實例,初始狀態為未觸發(false)
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
// 線程 1:等待事件觸發
manualResetEvent.WaitOne(); // 當前線程會阻塞,直到事件被設置為已觸發狀態
// 線程 2:觸發事件
manualResetEvent.Set(); // 事件被設置為已觸發狀態,線程 1 可以繼續執行
// 線程 3:等待事件觸發
manualResetEvent.WaitOne(); // 當前線程會阻塞,直到事件被設置為已觸發狀態
在上面的示例中,manualResetEvent
的狀態在 Set
和 Reset
方法之間進行了切換,以控制線程的執行流程。
需要注意的是,在使用 ManualResetEvent
時要避免出現死鎖的情況。確保在調用 WaitOne
方法之前已經正確地調用了 Set
方法,并且在不需要等待事件時及時調用 Reset
方法將其重置為未觸發狀態。
此外,還可以使用 ManualResetEventSlim
類,它是 ManualResetEvent
的一個更輕量級的替代品,提供了類似的功能,但具有更簡單的 API 和更好的性能特性。