C# の ManualResetEvent の使用例
ManualResetEventはC#でのスレッド同期プリミティブで、マルチスレッド環境におけるスレッド間の同期と通信に使用されます。以下にManualResetEventの使用方法の要約を示します。
- ManualResetEventオブジェクトを作成する:
ManualResetEvent mre = new ManualResetEvent(false);
コンストラクタによって初期状態を指定することができ、falseはイベントが未終了状態、trueはイベントが終了状態を表す。
- イベントの発生を待機する:
mre.WaitOne();
このイベントが非シグナル状態の場合、WaitOneメソッドの呼び出しは、イベントが別のスレッドによってシグナル状態に設定されるまで現在のスレッドをブロックします。
- イベントを完了状態に設定します。
mre.Set();
Setメソッド呼び出しによってイベントが終了状態に設定されると、WaitOneメソッドでブロックされているすべてのスレッドが再開されます。
- イベントを未完了状態へリセットする:
mre.Reset();
非終了状態にイベントをリセットし、後のWaitOneメソッドによりスレッドを再びブロックできるようにするために、Resetメソッドを呼び出す。
- タイムアウトまでイベントが発生するのを待つ
mre.WaitOne(timeout);
タイムアウトを指定するWaitOneメソッドのオーバーロードを使用すると、タイムアウト時間内にイベントが発生しなかった場合、WaitOneメソッドはfalseを返します。
- 事象の状態判断
bool signaled = mre.WaitOne(0);
WaitOneメソッドのオーバーロード形式を使うことで0のタイムアウト時間を指定すれば、WaitOneメソッドは即座に返り、イベントの現在の状態を示す戻り値を返します。
- WaitHandle.WaitAllおよびWaitHandle.WaitAnyによる複数のイベント発生の待機
WaitHandle.WaitAll(handles); // 等待所有事件都发生
WaitHandle.WaitAny(handles); // 等待任意一个事件发生
WaitHandleの静的メソッドWaitAllとWaitAnyを利用することで複数のイベント発生を待機できます。
ManualResetEvent は他のスレッドからシグナルをセットしないと解除されずにロックされ続けることに注意してください. 解除したいときは AutoResetEvent をご検討ください.