Windows服务每6小时做一次作业
本文关键字:一次作业 6小时 服务 Windows | 更新日期: 2023-09-27 18:15:17
我有一个只有两个方法的windows服务-一个私有方法DoWork()
和一个调用DoWork
方法的公开方法。我想实现以下目标:
- Windows服务每6小时运行一次
DoWork()
方法 - 外部程序也可以调用调用
DoWork()
方法的暴露方法。如果服务已经在运行从该服务调用的方法,DoWork()
将在当前方法结束后再次被调用。
解决这个问题的最好方法是什么?谢谢!
另一种方法是使用控制台应用程序,它可以被Windows任务调度程序调度为每6小时运行一次。在这种情况下,你不会浪费资源来保持Windows服务的运行,而只是在需要的时候消耗资源。
对于你的第二个问题:当你采用控制台应用程序方法时,你可以通过使用Process来调用它。例如:
如果您的应用程序的目的只是每六个小时运行一个特定的任务,那么您最好创建一个命令行应用程序并创建一个Windows自动运行的计划任务。显然,您可以手动启动此应用程序。
如果你仍然确信你需要一个服务(老实说,从我目前所看到的来看,听起来你不需要),你应该考虑使用Timer,但要仔细选择你的Timer,并阅读这篇文章,以更好地理解。net内置的定时器(提示:密切关注System.Timers.Timer)。
如果另一个方法在进程执行其操作时试图调用DoWork(),为了防止重入,请考虑使用互斥锁或信号量。
两种方法都有优点和缺点。对于这些选项,我倾向于选择Windows服务,因为它使您的部署更容易。使用Windows任务调度器调度任务是可编写脚本的,并且可以自动部署到新机器/环境中,但它仍然比仅仅部署和安装Windows服务更不标准。您还需要确保任务调度器在一个可以进行web服务调用的帐户下运行,并且您不会遇到密码过期和计划任务突然停止运行的问题。但是,对于Windows服务,您需要进行某种检查,以确保它始终在运行,并且如果它重新启动,您不会丢失让它知道下一次应该运行的状态。
您可以考虑的另一个选项是使用nservicebus传奇。saga实际上不仅仅是用于调度任务(它们为持续时间超过单个请求/消息持续时间的工作流类型过程持久化状态),而且它们还具有处理周期性或基于时间的过程的好方法(这是长时间运行工作流的重要组成部分)。在这种情况下,saga可以请求它在请求时从超时管理器返回消息。使用nservicebus是一个更大的体系结构问题,可能远远超出了您在这里所问的范围,但是传奇已经成为我对周期性过程的看法,它带来的额外好处是能够管理流程的一些持久状态(这可能是一个问题,也可能不是一个问题),并使您有理由思考一些您以前可能没有考虑过的体系结构问题。
您可以为您的目的创建一个控制台应用程序。您可以将应用程序安排为每6小时运行一次。控制台将在应用程序启动时调用一个默认方法。你可以从这个方法调用你的例程。希望这对你有帮助!