我编写了一个Timer类,以便在轮询另一个系统的Windows服务中使用它。我这样做是因为我有两个问题,而System.Timers.Timer
没有解决。
- Elapsed EventHanler在后台运行,因此如果主线程结束,其执行将中止。我希望
System.Timers.Timer.Stop
函数能阻塞主线程,直到Elapsed EventHanler的执行结束。 System.Timers.Timer
不能处理事件重入。我希望Interval在两个Elapsed EventHanler之间,以便定时器不会在前一次调用(+interval)尚未完成时调用Elapsed EventHanler。
在编写这个类时,我发现自己需要处理一些涉及线程的问题,由于我在这方面经验不太丰富,所以想知道以下Timer类是否是线程安全的?
public class Timer
{
System.Timers.Timer timer = new System.Timers.Timer() { AutoReset = false };
ManualResetEvent busy = new ManualResetEvent(true);
public double Interval
{
get { return timer.Interval; }
set { timer.Interval = value; }
}
public Timer()
{
timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
busy.Reset();
OnElapsed(e);
timer.Start();
}
finally
{
busy.Set();
}
}
public event EventHandler Elapsed;
protected void OnElapsed(EventArgs e)
{
if (Elapsed != null)
{
Elapsed(this, e);
}
}
public virtual void Start()
{
busy.WaitOne();
timer.Start();
}
public virtual void Stop()
{
busy.WaitOne();
timer.Stop();
}
}