【发布时间】:2013-11-29 09:20:51
【问题描述】:
我每天早上 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 点到达不是当天,而是第二天,它会执行失败。
有谁知道可能出了什么问题?
【问题讨论】:
-
你能发布更多代码吗?具体来说,您是否确保您的计时器可以持续到第二天?使用var表示局部变量...
-
请注意,这不会处理时间更改。如果您有 DST,它可能会更改为早上 6 点或凌晨 4 点。
-
如果您希望它在特定时间点运行,而不是将其作为服务,您可以考虑将其作为普通控制台应用程序,并使用 Windows 任务计划程序运行它
-
@MarceloBarbosa 我在服务中有几种方法,它们在不同的时间运行并做不同的事情(一种方法在早上 8 点运行,第二种在下午 3 点运行,第三种在晚上 9 点运行),所以我认为是这样设置比让三个控制台应用程序在不同的时间运行并做不同的事情更容易,特别是如果你有很多方法,我不知道,也许这只是个人喜好......
标签: c# timer windows-services