微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在特定时间C#(Windows服务)每天执行方法的代码失败

我有这个代码每天凌晨5点执行 Windows服务的方法

编辑:

MyService ws = new MyService ();

protected override void OnStart(string[] args)
{
    if (serviceHost != null)
    {
        serviceHost.Close();
    }

    serviceHost = new ServiceHost(typeof(MyService));

    serviceHost.open();
    double TimeOfExecution = 5;

    DateTime Now = DateTime.Now;
    DateTime today5am = Now.Date.AddHours(TimeOfExecution);
    DateTime next5am = Now <= today5am ? today5am : today5am.AddDays(1);

    System.Threading.TimerCallback callback = new System.Threading.TimerCallback(ws.MethodToExecute());

    var timer1 = new System.Threading.Timer(callback,null,next5am - DateTime.Now,TimeSpan.FromHours(24));

 }

我希望服务在下一个5点执行,之后每24小时执行一次.

方法MethodToExecute()确实在当天5点(或其他某个指定时间)执行,但第二天它无法执行.此外,似乎我第一次执行它并不重要,但似乎服务在一段时间后进入休眠状态并且不执行,所以如果5点到达而不是当天,但是第二天,它将无法执行.

有谁知道什么可能是错的?

解决方法

GC将收集您的计时器,因为在OnStart方法之后您没有任何对它的引用.

你只是将它作为局部变量.我希望你知道一旦JIT说它们不再用在代码中,局部变量就有资格进行垃圾收集.

修复:只需将计时器存储在变量实例中,就完成了.

private System.Threading.Timer my5AmTimer = null;

protected override void OnStart(string[] args)
{
    //All other code..

   this.my5AmTimer = new System.Threading.Timer(callback,TimeSpan.FromHours(24));
}

原文地址:https://www.jb51.cc/csharp/97026.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐