我有一个运行在应用服务器上的.net WCF windows服务,它会持续监控文件夹中的xml文件。如何使此服务仅在每天的特定时间(01.00小时)运行?
谢谢。
发布于 2009-04-25 23:52:16
您的服务是一个真正的服务,还是仅仅是一个监控XML文件夹的WCF应用程序?
如果您的WCF服务只是一个普通的应用程序,最简单的方法是使用Windows中的计划任务功能(在控制面板中找到)。只需让应用程序在启动时检查文件夹,并设置一个计划任务,在您想要的任何时间启动应用程序。
如果目标应用程序是真正的Windows服务,则需要使用内部计时器。看一下System.Timers.Timer类。
public void OnLoad() {
Timer timer = new Timer();
// Add event handler
timer.Elapsed += WorkMethod;
// Give us more control over the timer.
timer.AutoReset = false;
SetupTimer(timer);
}
// Setups the timer for the next interval and starts it.
private void SetupTimer(Timer timer) {
timer.Interval = GetNextChecktime().Subtract(DateTime.Now).TotalMillisecond;
timer.Start();
}
private void WorkMethod(object sender, EventArgs e) {
// Do work here
// Setup the timer for the next cycle.
SetupTimer((Timer)sender);
}
private DateTime GetNextChecktime() {
// Return the next time the service should run as a datetime.
}使用SetupTimer而不是使用自动重复的AutoReset = true的原因是为了使计时器与GetNextChecktime()同步。仅使用24*60*60*1000毫秒作为已用计时器将提供24小时阶段,但您需要在01:00启动脚本,才能让它在每天的01:00运行。
如果您仍然可以影响应用程序的运行方式,我实际上推荐第一种方法。除非您在服务中有更多的功能,或者需要维护一些持久状态,否则更简单的做法是让一个应用程序在启动时监视文件夹,然后退出。它也更容易调试,更不容易出错,因为调度是由Windows完成的。
发布于 2009-04-26 09:04:39
如果你每天只需要运行你的服务一次或两次(甚至一周只运行一次),我会创建一个控制台应用程序,并使用Windows的“计划任务”将其安排在选定的时间运行。这样,只有Windows系统本身会检查是否已经到了唤醒您的服务并进行处理的“正确”时间。
如果您有一个需要全天候运行的服务,例如,只在给定的时间窗口内处理消息,那么Windows (NT)服务可能是您的选择,它在后台运行,在服务器上运行,无需用户登录,并且可以做各种事情,如检查时间以查看是否需要工作,如果不需要,它可以继续休眠:-)
根据我的经验,服务的编程和调试有点棘手-如果你可以将你的逻辑打包到一个独立的控制台应用程序中,并将其作为计划任务运行,我更喜欢这个解决方案。它更简单,而且仍然能很好地完成这项工作。
Marc
https://stackoverflow.com/questions/789852
复制相似问题