Я написал класс Timer, чтобы использовать его в службе Windows, которая опрашивает другую систему. Я сделал это, потому что у меня было две проблемы, которые System.Timers.Timer
не решает.
- Elapsed EventHanler работает в фоновом режиме, поэтому его выполнение будет прервано, если основной поток завершится. Я хотел, чтобы функция
System.Timers.Timer.Stop
блокировала основной поток до завершения выполнения Elapsed EventHanler. System.Timers.Timer
не имеет дело с повторным входом события. Я хочу, чтобы интервал находился между двумя Elapsed EventHanler, чтобы таймер никогда не вызывал 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();
}
}