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();
         //}
        }
    }
}

Windows服务没有';t根据间隔时间启动

您的问题是比较日期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();
}
         //}
        }
    }
}