ManualResetEvent 是一個同步原語,用于控制多個線程的并發執行。
ManualResetEvent 主要用于兩個線程間的同步。一個線程(稱為等待線程)等待 ManualResetEvent 進入等待狀態,而另一個線程(稱為信號線程)通過設置 ManualResetEvent 來指示等待線程可以繼續執行。
使用 ManualResetEvent 的基本流程如下:
創建一個 ManualResetEvent 實例:
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
傳入的布爾值表示是否初始處于有信號狀態。如果為 true,創建后會立即進入有信號狀態;如果為 false,創建后會進入無信號狀態。
等待線程調用 ManualResetEvent 的 WaitOne 方法進入等待狀態:
manualResetEvent.WaitOne();
如果 ManualResetEvent 處于有信號狀態,WaitOne 方法會立即返回;如果 ManualResetEvent 處于無信號狀態,WaitOne 方法會使等待線程進入等待狀態,直到 ManualResetEvent 被設置為有信號狀態。
信號線程調用 ManualResetEvent 的 Set 方法來設置 ManualResetEvent 為有信號狀態:
manualResetEvent.Set();
這會釋放等待線程,并使其繼續執行。
如果需要將 ManualResetEvent 重新設置為無信號狀態,可以調用 Reset 方法:
manualResetEvent.Reset();
這會使下次等待線程進入等待狀態。
ManualResetEvent 還有一些其他的成員方法和屬性,例如 WaitOne 的重載方法可以設置等待的超時時間,Handle 屬性可以獲取操作系統的內核對象句柄等。
需要注意的是,ManualResetEvent 可以用于多個線程的同步,但只能由一個線程將其設置為有信號狀態。因此,在使用 ManualResetEvent 進行同步時,需要保證只有一個線程調用 Set 方法來設置 ManualResetEvent。