如何在每10分钟内在服务中运行一个函数?

我有一个运行的Windows服务,在这里我想每隔几分钟运行一个function。 我找到了一些代码,但似乎没有用? 我有一个记录器,它似乎没有进入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) { // 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(); } } 

你需要启动计时器:

 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 } 

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

我也需要这个function。 也就是说,我的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。 我认为我们不需要它

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

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

尝试启动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(); } }