と を使用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ように置き換えます。PulseSet
コード#3
lock (_locker)
{ _signal = true;
Monitor.Pulse (_locker);
}
ここで質問です。コード #2 の行_signal = false;。
なぜ必要なのですか?1 つの待機ハンドルPulseにのみ到達し、ブロックされたアイテムを 1 つだけ通過させ、ゲートを自動的に閉じることを知っています。AutoREsetEvent
では、なぜ書く_signal = false必要があるのですか?.