【问题标题】:Timer in OnStart Method in Windows ServiceWindows 服务中 OnStart 方法中的计时器
【发布时间】:2018-11-16 08:33:32
【问题描述】:

我在 C# 中创建了 Windows 服务并创建了系统计时器并在 OnStart() 方法中启动它。当我在 PC 中上传服务时出现问题。我确实对其进行了调试,所以问题是当 OnStart 方法启动计时器时,计时器中任何方法(DBinsert 方法)中的所有代码都将无限继续(第 1 行,第 2 行,....第 15 行然后转到第 1 行..再次)怎么能我解决?

Timer tmr = new Timer();

protected override void OnStart(string[] args)
{
    tmr.Interval = 5000;
    tmr.Elapsed += tmr_Elapsed;
    tmr.Start();
}

private void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
    DBconnection.DBinsert();
}

【问题讨论】:

  • 这是因为你的时间间隔等于5秒,我猜你的调试速度没有比这快。
  • Rascar - 对于您发布的少量代码,很难提供帮助。例如,DBconnection 在哪里初始化? DBInsert 是做什么的?在调试器之外运行服务时遇到什么问题?
  • @DavidKemp 所有无关紧要的东西,OP 想知道,为什么他在DBinsert() 方法中的代码在他调试时一遍又一遍地执行。他的Interval 设置为5000 毫秒(等于5 秒),所以如果他开始调试并通过少于5 秒的代码,他将一遍又一遍地重新开始,因为计时器已经过去.
  • 关于@SeM所说的,也许你可以在Elapsed事件处理程序中添加一些条件编译,当它进入方法时将StopTimerStart它当它离开时再次。这样,您可以在调试时在该方法中使用任意时间,并且不会影响您的 Release 构建。
  • 伙计们,不仅调试时间,当我没有调试就启动服务时它不会给出结果... DBinsert 是静态的,我不创建 DBconnection 类的实例。在 DBinsert 中,如果存在新电子邮件,我只检查 Outlook 邮件将其插入数据库,但从某些代码行中,它将 1 行作为无穷大

标签: c# windows service


【解决方案1】:

我会将此作为答案发布,以便发布一些代码。如果您不熟悉,这就是我在评论中提到条件编译时的意思:

    private void tmr_Elapsed(object sender, ElapsedEventArgs e)
    {
#if DEBUG
        tmr.Stop();
#endif
        DBconnection.DBinsert();
#if DEBUG
        tmr.Start();
#endif
    }

请注意,即使您不调试该事件处理程序,它仍然会停止并启动 Timer,因此这意味着您的时间间隔实际上会比 5 秒长一点,但我怀疑那也是大问题。您可以随时在调试中将TimerInterval 设置为稍小的值,以根据需要进行补偿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多