使用计时器对象时,如何处理c#窗口服务工作正在等待处理

时间:2011-12-20 12:59:27

标签: c#

嗨,我正在研究c#窗口服务,因为我在onstart方法中设置了一些定时器代码,如下面的代码我粘贴了它:

protected override void OnStart(string[] args)
{
    timerjob.Elapsed += new ElapsedEventHandler(CsvGenFromDatabase);
    // ad 2: set interval to 1 minute (= 60,000 milliseconds)
    timerjob.Interval = Convert.ToDouble(DueTime);
    //  ////ad 3: enabling the timer
    timerjob.Enabled = true;
}

CsvGenFromDatabase是我的方法,这将是我的服务,这里我的问题是我设置了一个计时器(到期时间)大约1分钟,例如,如果我测试简单的卷工作意味着它表现良好,如果假设我给了一个巨大的音量当计时器(到期时间)相同1分钟时,服务要做的工作我面临一些错误,因为仍然服务工作没有完成但是时间1分钟过去了因为服务将轮询新实例过去的工作没有完全完成,因为这种情况如何处理我的服务,而不是在一个实例中服务的任何工作,请任何提出建议请

3 个答案:

答案 0 :(得分:0)

CsvGenFromDatabase方法中,您可以在长时间运行的过程之前调用timerjob.Stop()。一旦完成该过程,您可以致电timerjob.Start()再次启动计时器。

示例:

private void CsvGenFromDatabase()
{
    timerjob.Stop();

    //long running process

    timerjob.Start();
}

我假设timerjob在全球范围内可用。

答案 1 :(得分:0)

你可以使用Thread来完成这项工作,每次调用后,调用Thread.Sleep(60000)来停止服务。

这是一个供你考虑的样本:

Windows Service with Thread

答案 2 :(得分:0)

您可以执行的一种方法是在CsvGenFromDatabase中计时器。

timer.Enabled = false;

这将停止计时器。

然后当你完成。重新启用计时器。在finally块中重新启用。

因此,这将确保在再次运行计时器之前完成工作。有点脏,但它应该工作。

像这样的东西 在您的CsvGenFromDatabase

CsvGenFromDatabase()
{
   try
   {
      timer.Enabled = false;

       //do your work

    }
    finally
    {
       timer.Enabled = true;
    }
  }