Windows服务不会根据间隔时间启动

时间:2012-04-03 06:47:51

标签: c#

我写了一个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();
         //}
        }

    }
}

3 个答案:

答案 0 :(得分:3)

您的问题是日期if (_lastRun.Date < DateTime.Now.Date)的比较,因此您的代码每天运行一次。

答案 1 :(得分:2)

我同意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包装它,最后处理异常并确保再次启动计时器。另请查看此链接Best Timer for using in a Windows service

答案 2 :(得分:0)

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

    }
}