我有一些需要运行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
}
}
}
我的担心与我如何实例化Timer有关。如果我以0 dueTime启动它,则注释表示计时器将立即启动。如果调用线程被定时器抢占并且this._reset.Set()
调用在调用线程有机会调用this._reset.WaitOne()
之前发生,会发生什么?这是我要担心的事吗?到目前为止,在我的测试中,代码就像我期待的那样。
请注意,我以这种方式设置代码,因为我想阻止Run()
函数,直到condition()
为真,但我只想每隔一秒左右检查condition()
。