C#でのManualResetEventの使い方は何ですか。
ManualResetEventは、複数のスレッドの並行実行を制御するための同期プリミティブです。
ManualResetEvent は、2つのスレッド間で同期するために主に使用されます。1つのスレッド(待機スレッドと呼ばれる)は、ManualResetEvent が待機状態に入るのを待ち、もう1つのスレッド(シグナルスレッドと呼ばれる)は、ManualResetEvent を設定することで待機スレッドが続行できることを示します。
ManualResetEventを使用した基本的な流れは次の通りです:
- ManualResetEvent インスタンスを作成してください。
- manualResetEventというManualResetEvent型のオブジェクトをfalseで初期化します。
- 渡されるブール値は、初期状態がシグナルのある状態かどうかを示します。trueの場合、作成後すぐにシグナル状態に入ります。falseの場合、作成後にシグナルなしの状態に入ります。
- 待機スレッドがManualResetEventのWaitOneメソッドを呼び出して待機状態に入る:
- マニュアルリセットイベントを待機します。
- ManualResetEvent がシグナル状態にある場合、WaitOne メソッドはすぐに戻ります。ManualResetEvent がシグナル状態でない場合、WaitOne メソッドは待機スレッドを待機状態にし、ManualResetEvent がシグナル状態に設定されるまで待機します。
- 信号線程は、ManualResetEventのSetメソッドを呼び出して、ManualResetEventをシグナル状態に設定します。
- マニュアルリセットイベントを設定します。
- 待ちスレッドを解放して、それを続行させる。
- ManualResetEvent をシグナルなしの状態に再設定したい場合は、Reset メソッドを呼び出すことができます。
- マニュアルリセットイベントをリセットします。
- 次に待機中のスレッドが待機状態に入るようになります。
ManualResetEventには、WaitOneメソッドのオーバーロードがあり、待機時間を設定できるほか、HandleプロパティでOSのカーネルオブジェクトハンドルを取得するなど、他のメンバーメソッドやプロパティもあります。
ManualResetEventは、複数のスレッドの同期に使用できますが、1つのスレッドのみがそれをシグナル状態に設定できます。したがって、ManualResetEventを使用して同期する際には、Setメソッドを呼び出すスレッドが1つだけであることを確認する必要があります。