2 using System.Collections.Generic;
3 using System.Diagnostics;
5 using System.Threading;
10 /// ON, OFF, 無効 の3状態を持つイベント。
13 /// 状態が 無効 にされると、ON待ち/OFF待ちスレッドのブロックはいずれも解除され、
14 /// またそれ以降、状態を変更することはできなくなる(リセットすると戻る)。
16 public class TriStateEvent
18 public enum 状態種別 { ON, OFF, 無効 }
33 if( this._状態 == 状態種別.無効 )
34 return; // 一度無効になったら、以降は変更不可。
41 this._無効イベント?.Reset();
42 this._OFFイベント?.Reset();
47 this._無効イベント?.Reset();
48 this._ONイベント?.Reset();
62 public TriStateEvent( 状態種別 初期状態 = 状態種別.OFF )
68 /// 状態が ON または 無効 になるまでブロックする。
71 /// 解除後の状態(ON または 無効)。
73 public 状態種別 ONになるまでブロックする()
75 int h = EventWaitHandle.WaitAny( new EventWaitHandle[] { this._ONイベント, this._無効イベント } );
76 return ( h == 0 ) ? 状態種別.ON : 状態種別.無効;
80 /// 状態が OFF または 無効 になるまでブロックする。
83 /// 解除後の状態(OFF または 無効)。
85 public 状態種別 OFFになるまでブロックする()
87 int h = EventWaitHandle.WaitAny( new EventWaitHandle[] { this._OFFイベント, this._無効イベント } );
88 return ( h == 0 ) ? 状態種別.OFF : 状態種別.無効;
92 /// 状態が 無効 になるまでブロックする。
94 public void 無効になるまでブロックする()
96 this._無効イベント.WaitOne();
103 public void リセットする( 状態種別 初期状態 = 状態種別.OFF )
105 lock( this._スレッド間同期 )
109 this._無効イベント = new ManualResetEvent( false );
110 this._ONイベント = new ManualResetEvent( 初期状態 == 状態種別.ON );
111 this._OFFイベント = new ManualResetEvent( 初期状態 == 状態種別.OFF );
115 private 状態種別 _状態 = 状態種別.OFF;
116 private ManualResetEvent _無効イベント = null;
117 private ManualResetEvent _ONイベント = null;
118 private ManualResetEvent _OFFイベント = null;
119 private readonly object _スレッド間同期 = new object();