タイマーを実行する必要があるコードがいくつかあります。Timer は条件をチェックし、その結果に基づいて、続行できることを呼び出し元に通知します。ここに私の疑似コードがあります:
class MyClass
{
private AutoResetEvent _reset;
private System.Threading.Timer _timer;
public void Run()
{
this._reset = new AutoResetEvent(false);
this._timer = new System.Threading.Timer(this.TimerStep, null, 0, 1000);
this._reset.WaitOne(); //wait for condition() to be true
this._reset.Dispose();
this._timer.Dispose();
}
private void TimerStep(object arg)
{
if(condition())
{
this._reset.Set(); //should happen after the _reset.WaitOne() call
}
}
}
私の懸念は、タイマーをインスタンス化する方法に関係しています。dueTime を 0 にして開始すると、コメントにはタイマーがすぐに開始されると書かれています。呼び出し元のスレッドがタイマーによってプリエンプトされ、呼び出し元のthis._reset.Set()
スレッドが を呼び出す前に呼び出しが発生した場合はどうなりますthis._reset.WaitOne()
か? これは私が心配しなければならないことですか?これまでのテストでは、コードは期待どおりに機能します。
が true にRun()
なるまで関数をブロックしたいので、この方法でコードを設定したことに注意してください。ただし、1秒ごとにチェックするだけです。condition()
condition()