WCF Windows服务作为计划服务

时间:2009-04-25 22:30:48

标签: wcf windows-services

我在应用服务器上运行.net WCF Windows服务,该服务一直监视xml文件的文件夹。 如何在每天的特定时间(01.00小时)运行此服务?

感谢。

2 个答案:

答案 0 :(得分:9)

您的服务是真实服务还是仅监视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完成,因此调试也更容易,并且更不容易出错。

答案 1 :(得分:2)

如果您需要每天只运行一次或两次服务(甚至每周只运行一次),我会创建一个控制台应用程序,并使用Windows“计划任务”安排它在这些选定的时间运行。这样,只有Windows系统本身才会检查是否已经到达“正确”的时间来唤醒您的服务并进行处理。

如果您的服务需要全天候运行,例如只在给定的时间窗口内处理消息,然后Windows(NT)服务可能是您的选择,它在后台运行,在没有用户登录的情况下在服务器上运行,并且可以执行各种操作,例如检查时间看它是否需要工作,如果没有,它可以继续睡觉:-)

根据我的经验,编程和调试的服务有点棘手 - 如果您可以将逻辑打包到一个独立的控制台应用程序并按计划任务运行,我更喜欢这个解决方案。它更容易,但仍然可以很好地完成。

马克