Windows服务没有';t根据间隔时间启动
本文关键字:启动 时间 服务 Windows | 更新日期: 2023-09-27 18:29:45
我写了一个windows服务,每隔10分钟调用一次类库,它在启动或重新启动时都能正常工作。一旦完成任务,它假设每10分钟重新运行一次,但这根本没有发生。我不确定缺了什么,有人请认准方式。
这是我的代码
public partial class Service1 : ServiceBase
{
private Timer _timer;
private DateTime _lastRun = DateTime.Now;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
_timer = new Timer(10 * 60 * 1000); // every 10 minutes
_timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
Shell Distribute= new Shell();
Distribute.Distribute();
}
protected override void OnStop()
{
this.ExitCode = 0;
base.OnStop();
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//if (_lastRun.Date < DateTime.Now.Date)
//{
_timer.Stop();
_lastRun = DateTime.Now;
_timer.Start();
//}
}
}
}
您的问题是比较日期if (_lastRun.Date < DateTime.Now.Date)
,因此您的代码每天运行一次。
我同意Ozgur的观点。看来你的逻辑是错误的。您可以在timer_Elapsed事件期间停止计时器。您是否逻辑并重新启动计时器
类似于:
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try{
// stop the timer while we are running the cleanup task
_timer.Stop();
//
// do cleanup stuff
//
}catch (Exception e){
//do your error handling here.
}
finally{
_timer.Start();
}
}
}
只需用try-catch包装它,最后就可以处理异常并确保计时器再次启动。此外,请查看此链接在Windows服务中使用的最佳计时器
Okie最后我得到了答案,为什么它不起作用(其他论坛的一位专家指出了我的错误)
这是基于定时器间隔的代码运行良好。
public partial class Service1 : ServiceBase
{
private Timer _timer;
private DateTime _lastRun = DateTime.Now;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
_timer = new Timer(10 * 60 * 1000); // every 10 minutes
_timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
Shell Distribute= new Shell();
Distribute.Distribute();
_timer.start();//this line was missed in my original code
}
protected override void OnStop()
{
this.ExitCode = 0;
base.OnStop();
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//if (_lastRun.Date < DateTime.Now.Date)
//{
try
{
_timer.Stop();
Shell Distribute= new Shell();
Distribute.Distribute();
}
catch(exception ex)
{}
finally
{
_timer.Start();
}
//}
}
}
}