0

タイマーを実行する必要があるコードがいくつかあります。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()

4

0 に答える 0