次のパターンを検討してください。
private AutoResetEvent signal = new AutoResetEvent(false);
private void Work()
{
while (true)
{
Thread.Sleep(5000);
signal.Set();
//has a waiting thread definitely been signaled by now?
signal.Reset();
}
}
public void WaitForNextEvent()
{
signal.WaitOne();
}
このパターンの目的は、外部コンシューマーが特定のイベント (メッセージの到着など) を待機できるようにすることです。WaitForNextEvent
クラス内からは呼び出されません。
よく知られている例として、 を考えてみましょうSystem.Diagnostics.Process
。イベントを公開しますが、プロセスが終了するまで呼び出し元が同期的に待機できるようにExited
するメソッドも公開します。WaitForExit
これが私がここで達成しようとしていることです。
私が必要な理由は、既に呼び出された後signal.Reset()
にスレッドが呼び出された場合 (つまり、スレッドが待機していないときに呼び出された場合)、イベントが既に通知されているため、すぐに戻るためです。WaitForNextEvent
signal.Set()
.Set
質問
- スレッド呼び出しが呼び出される前
WaitForNextEvent()
に通知されることが保証されていますか? そうでない場合、メソッドを実装するための他のソリューションは何ですか?signal.Reset()
WaitFor