在特定时间C#(Windows服务)每天执行方法的代码失败
发布时间:2020-12-15 17:48:39 所属栏目:百科 来源:网络整理
导读:我有这个代码每天凌晨5点执行 Windows服务的方法: 编辑: MyService ws = new MyService ();protected override void OnStart(string[] args){ if (serviceHost != null) { serviceHost.Close(); } serviceHost = new ServiceHost(typeof(MyService)); serv
我有这个代码每天凌晨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)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |