【问题标题】:how to have a function run inside a service every 10 minutes?如何每 10 分钟在服务中运行一个函数?
【发布时间】:2012-04-29 15:56:48
【问题描述】:

我有一个 Windows 服务正在运行,我想在其中每隔几分钟运行一个函数。 我找到了一些代码,但它似乎不起作用? 我有一个记录器,但它似乎没有进入 timer_Elapsed 函数?

 protected override void OnStart(string[] args)
    {
       // SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
       // test.Import();
         log.Info("Info - Service Started");
        _timer = new Timer(10 * 60 * 1000); // every 10 minutes??
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        log.Info("Info - Check time");
        DateTime startAt = DateTime.Today.AddHours(9).AddMinutes(48);
        if (_lastRun < startAt && DateTime.Now >= startAt)
        {
            // stop the timer 
            _timer.Stop();               

            try
            {
                log.Info("Info - Import");
                SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
                test.Import();
            }
            catch (Exception ex) {
                log.Error("This is my error - ", ex);
            }

            _lastRun = DateTime.Now;
            _timer.Start();
        }
    }

【问题讨论】:

标签: c# windows-services


【解决方案1】:

你需要启动计时器:

protected override void OnStart(string[] args)
{
     log.Info("Info - Service Started");
    _timer = new Timer(10 * 60 * 1000); // every 10 minutes
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    _timer.Start(); // <- important
}

【讨论】:

  • 这10分钟,我更喜欢使用TimeSpan.FromMinutes(10).TotalMilliseconds;而不是10 * 60 * 1000
【解决方案2】:

我没有看到_timer.Start(),这应该是你的问题。

【讨论】:

    【解决方案3】:

    Daniel Hilgarth 是正确的 - 主要问题是您永远不会在计时器上调用 Start。

    话虽如此,您可能还想考虑使用 Windows 任务计划程序而不是带有计时器的服务。这允许您将任务安排为每 10 分钟运行一次,但也可以在需要时更改时间表,而无需更改编译。

    【讨论】:

      【解决方案4】:

      我也需要这个功能。也就是说,我的 C# windows 服务必须每 10 分钟检查一次电子邮件。我剥离了一些逻辑以使代码更有效,如下:

      private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
              {
                  _timer.Stop();
                  try
                  {
                      EventLog.WriteEntry(Program.EventLogName, "Checking emails " + _count++);
                  }
                  catch (Exception ex)
                  {
                      EventLog.WriteEntry(Program.EventLogName, "This is my error " + ex.Message);
                  }
                  _timer.Start();
              }
      

      timer_elapsed 方法确实会每 10 分钟调用一次,从第一个 _timer.start() 开始,顺便说一下你错过了它。我没有对 _lastRun 和 startAt 进行任何检查。我认为我们不需要它

      【讨论】:

        【解决方案5】:

        尝试启动timer

        protected override void OnStart(string[] args)
            {
               // SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
               // test.Import();
                 log.Info("Info - Service Started");
                _timer = new Timer(10 * 60 * 1000); // every 10 minutes??
                    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        _timer.Start();
            }
        
            private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                log.Info("Info - Check time");
                DateTime startAt = DateTime.Today.AddHours(9).AddMinutes(48);
                if (_lastRun < startAt && DateTime.Now >= startAt)
                {
                    // stop the timer 
                    _timer.Stop();               
        
                    try
                    {
                        log.Info("Info - Import");
                        SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
                        test.Import();
                    }
                    catch (Exception ex) {
                        log.Error("This is my error - ", ex);
                    }
        
                    _lastRun = DateTime.Now;
                    _timer.Start();
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-07
          • 2015-12-31
          • 2023-03-16
          • 2020-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多