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