と を使用Wait
して、次のようPulse
に a をシミュレートできます。ManualResetEvent
コード#1
readonly object _locker = new object();
bool _signal;
void WaitOne()
{
lock (_locker)
{
while (!_signal) Monitor.Wait (_locker);
}
}
void Set()
{
lock (_locker)
{ _signal = true;
Monitor.PulseAll (_locker);
}
}
void Reset()
{
lock (_locker) _signal = false;
}
大丈夫
次に、それを次のように強化することについて話しましょうAutoREsetEvent
。
のAutoResetEvent
コードを次のように置き換えるだけですWaitOne
。
コード#2
lock (_locker)
{
while (!_signal) Monitor.Wait (_locker);
_signal = false;//<---------------
}
メソッド内で次のPulseAll
ように置き換えます。Pulse
Set
コード#3
lock (_locker)
{ _signal = true;
Monitor.Pulse (_locker);
}
ここで質問です。コード #2 の行_signal = false;
。
なぜ必要なのですか?1 つの待機ハンドルPulse
にのみ到達し、ブロックされたアイテムを 1 つだけ通過させ、ゲートを自動的に閉じることを知っています。AutoREsetEvent
では、なぜ書く_signal = false
必要があるのですか?.