2012-04-03 53 views
2

我写了一个Windows服务来叫我的类库,每10分钟间隔,它在启动时或重新启动。一旦工作完成它想重新再每10组分钟的运行工作正常这根本就没有发生。不知道什么是错过的,有人请确定正确的方式。的Windows服务没有启动,根据间隔时间

这里是我的代码

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

    } 
} 
+1

日期比较是最可能的原因。但是,Timer类在触发Elapsed事件时会吞下异常。您*必须*使用try/catch来诊断代码中的任何故障。不要跳过它,如果你这样做的话,异常是不可想象的。 – 2012-04-03 13:52:59

+0

@ HansPassant,即使我评论如果条件语句仍然是其无法运行该服务,每10分钟间隔 – Usher 2012-04-05 01:36:26

回答

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

    } 
} 
+0

有道理。我现在看到它的时候没有正确地阅读你的问题。您确实在服务启动事件中启动了该作业,但从未启用计时器。我想我需要新的眼镜。当你开始或重新启动这个主要提示时,你确实说得很好。我会将一些日志记录添加到catch块中,以便在计时器事件期间看到是否有任何错误。没有比吞服错误的服务更糟的了。 – Namphibian 2012-04-05 12:39:53

+0

我同意Namphibian,我将添加日志来查找服务启动时发生了什么。 – Usher 2012-04-06 01:09:38

3

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

+0

我彻底改变了我的代码和注释的部分还是它的基于时间间隔不运行,我不知道如何调试这一个。 – Usher 2012-04-05 01:25:44

2

我同意Özgür的。看来你的逻辑是错误的。您可以在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(); 
    } 

    } 
} 

与尝试捕捉只是包装它,并最终使你处理异常,可以确保定时器再次开始。此外,请查看以下链接Best Timer for using in a Windows service

+0

,我试过你的方法,但它不起作用 – Usher 2012-04-05 01:44:29

+0

我可以在这里提出建议。为什么不把某种形式的日志记录放入服务中。然后将调试消息写入日志。我通常使用一个简单的文本文件与调试信息。这可以帮助您跟踪问题。另外请确保你记录异常。 – Namphibian 2012-04-05 06:48:23