如何让函数每 10 分钟在服务中运行一次
本文关键字:运行 一次 服务 函数 分钟 | 更新日期: 2023-09-27 18:31:32
我有一个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();
}
}
您需要启动计时器:
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()
,那应该是你的问题。
Daniel Hilgarth 是正确的 - 主要问题是你永远不会在计时器上调用 Start。
话虽如此,您可能还需要考虑使用 Windows 任务计划程序,而不是带有计时器的服务。 这允许您将任务计划为每 10 分钟运行一次,但也可以随时更改计划,而无需更改编译。
我也需要这个功能。也就是说,我的 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进行任何检查。我认为我们不需要它
尝试启动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();
}
}