ManualResetEvent是C#中的一個線程同步原語,用于在多線程環境下進行線程間的同步與通信。以下是對ManualResetEvent的用法總結:
ManualResetEvent mre = new ManualResetEvent(false);
可以通過構造函數指定初始狀態,false表示事件為非終止狀態,true表示事件為終止狀態。
mre.WaitOne();
當事件為非終止狀態時,調用WaitOne方法會使當前線程阻塞,直到事件被其他線程設置為終止狀態。
mre.Set();
調用Set方法將事件設置為終止狀態,所有阻塞在WaitOne方法上的線程將被喚醒繼續執行。
mre.Reset();
調用Reset方法將事件重置為非終止狀態,以便后續的WaitOne方法可以再次阻塞線程。
mre.WaitOne(timeout);
可以通過WaitOne方法的重載形式指定超時時間,如果在超時時間內事件仍未發生,WaitOne方法會返回false。
bool signaled = mre.WaitOne(0);
可以通過WaitOne方法的重載形式指定超時時間為0,此時WaitOne方法會立即返回,返回值表示事件的當前狀態。
WaitHandle.WaitAll(handles); // 等待所有事件都發生
WaitHandle.WaitAny(handles); // 等待任意一個事件發生
可以通過WaitHandle的靜態方法WaitAll和WaitAny來等待多個事件的發生。
需要注意的是,ManualResetEvent是一個信號量,它只能由其他線程設置為終止狀態,而不能自動恢復為非終止狀態。如果需要自動恢復為非終止狀態,可以考慮使用AutoResetEvent。