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

 WLII庾斌_787 发布于 2023-02-13 19:53

我有这个代码每天凌晨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点到达而不是当天,但是第二天,它将无法执行.

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

2 个回答
  • GC将收集您,timer因为您在OnStart方法之后没有任何对它的引用.

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

    修复:只需存储timer一个变量实例,就完成了.

    private System.Threading.Timer my5AmTimer = null;
    
    protected override void OnStart(string[] args)
    {
        //All other code..
    
       this.my5AmTimer = new System.Threading.Timer(callback, null, next5am - DateTime.Now, TimeSpan.FromHours(24));
    }
    

    2023-02-13 19:55 回答
  • var timer1 = new System.Threading.Timer(...);
    

    定时器是棘手的对象.当它们不再被引用时,它们就像任何.NET对象一样受垃圾收集的影响.这个语句的语法足以知道何时发生这种情况,你对var节目的使用"timer1"是方法的局部变量.换句话说,在方法返回后创建的Timer对象没有任何引用.

    那么究竟是什么让Timer保持活跃并且在没有引用的情况下打勾?你发现:什么都没有.您的计时器是否实际打勾是一个废话.如果你的程序继续运行其他事情,那么它会触发gen#0集合,计时器将消失.永远不会打勾.如果你的程序没有,那么它将存活足够长的时间到达凌晨5点.

    必须将对象引用存储在一个变量中,以确保它能够存活足够长的时间.那应该是一个静态变量.

    或者使用System.Timers.Timer.它的行为很像System.Threading.Timer,但具有更好的生存技能.只要它具有Elapsed事件处理程序并且已启用,它就可以保证保持活动状态.

    2023-02-13 19:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有