定时器正在触发并执行即使第一个未完成?

时间:2015-03-11 13:00:30

标签: c# windows-services

我有一个Windows服务应用程序。我希望这个Windows服务在每x分钟后运行一个方法。我也想在现有方法运行时,它不应该允许执行timer方法。我有,

    private static readonly ILogger Logger = GetLogger();
    private Timer _timer;
    protected override void OnStart(string[] args)
    {
        Logger.Log("Starting Timer");
        StartTimer();
    }

    protected override void OnStop()
    {
        Logger.Log("Stoping Timer");
        StopTimer();
    }

    private void Timer_Elapsed(object state)
    {
        Logger.Log("Timer Elapsed");
        DoWork();
        RestartTimer();
    }

    private static void DoWork()
    {
        try
        {
            // Doing my work there
        }
        catch (Exception ex)
        {
            Logger.Log(ex);
        }
    }

    private void StartTimer()
    {
        Logger.Log("Running first time manually");
        ThreadPool.QueueUserWorkItem((_) => DoWork());
        var frequency = GetTimerFrequency();
        _timer = new Timer(Timer_Elapsed, null, frequency, Timeout.Infinite);
    }

    private void RestartTimer()
    {
        var frequency = GetTimerFrequency();
        _timer.Change(frequency, Timeout.Infinite);
    }

    private void StopTimer()
    {
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
        _timer.Dispose();
        _timer = null;
    }

我不知道为什么有些时候DoWork正在运行的时候,Timer_Elapsed正在执行。我希望在一个DoWork完成之后,不再允许DoWork执行。

1 个答案:

答案 0 :(得分:0)

这篇文章的

Possible Duplicate。您必须检查应用程序的状态是否已经运行。

Here