【发布时间】:2009-11-13 11:52:53
【问题描述】:
我编写了一个 Timer 类,以便在轮询另一个系统的 Windows 服务中使用它。我这样做是因为我有两个System.Timers.Timer 没有解决的问题。
- Elapsed EventHanler 在后台运行,因此如果主线程结束,它的执行将中止。我希望
System.Timers.Timer.Stop函数阻塞主线程,直到 Elapsed EventHanler 的执行结束。 -
System.Timers.Timer不处理事件重入。我希望间隔在两个 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();
}
}
【问题讨论】:
标签: c# .net multithreading timer