【问题标题】:how to handle the c# window service work is pending when using timer objects使用计时器对象时如何处理 c# 窗口服务工作未决
【发布时间】:2012-01-17 00:32:16
【问题描述】:

您好,我正在开发 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 分钟过去了,因为服务将轮询新实例,过去的工作没有完全完成,因为这种情况下,我如何处理我的服务而不影响任何工作,当服务在一个实例中时,请任何人提供建议

【问题讨论】:

  • 你需要使CsvGenFromDatabase reentrancy-safe...有不同的可能性(在运行或使用队列时忽略/禁用任何计时器事件,或者只是让它可以运行多次并行)。
  • 将 AutoReset 属性设置为 false 并在 CsvGenFromDatabase() 结束时重新启用计时器。在方法开始时将 Enabled 设置为 false 并不能解决问题,线程池线程可以备份。一定要捕获并记录异常,Elapsed 事件会在没有诊断的情况下吞下异常。 System.Threading.Timer 是一个更好的计时器。
  • @Abdul Munim 感谢您的理解,如果您知道我是窗口服务的新手,请您建议一下

标签: c#


【解决方案1】:

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

示例:

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

    //long running process

    timerjob.Start();
}

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

【讨论】:

  • Ritche 如果我这样做,除非工作 A 完成它不会开始工作 B,希望我们停止工作 B 开始吧?我是对的,请帮助我解决这个问题
  • 是的,如果您这样做,作业 B 将在长时间运行的作业完成之前启动。不过,这确实取决于您开始工作 B 的方式。
  • @ritche 你能建议我吗,在这种情况下我该如何处理工作 B,我不应该在工作 A 完成之前停止工作 B,希望你看到我的代码我该如何处理。跨度>
  • @pravz 您需要发布与您如何开始工作 B 相关的代码示例?这是与 CsvGenFromDatabase 不同的方法吗?
  • @ritche 感谢您的回复,我在此下只有一个主要方法 CSVGenFromDatabase 使用诸如 FILEGENERATIONXXX 之类的四种方法用于每个消息单独的方法,这些方法将根据状态从数据库中获取记录,它将创建一个文件在配置路径中,我们为其创建它将更新状态
【解决方案2】:

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

这是一个供您参考的示例:

Windows Service with Thread

【讨论】:

    【解决方案3】:

    您可以做的一种方法是在您的 CsvGenFromDatabase 中计时。

    timer.Enabled = false;
    

    这将停止计时器。

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

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

    类似的东西 在您的 CsvGenFromDatabase 中

    CsvGenFromDatabase()
    {
       try
       {
          timer.Enabled = false;
    
           //do your work
    
        }
        finally
        {
           timer.Enabled = true;
        }
      }
    

    【讨论】:

    • 你能说点简单的,我在哪里好意
    • ,在将计时器设置为假后,我在哪里重新启用我的计时器,希望它在我的启动条件下已经存在,它是否足够?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多