首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows服务每6小时完成一次

Windows服务每6小时完成一次
EN

Stack Overflow用户
提问于 2011-11-20 15:04:55
回答 4查看 1.4K关注 0票数 2

我有一个只有两个方法的windows服务--一个私有方法DoWork()和一个调用DoWork方法的公开方法。我要做到以下几点:

  • Windows服务每6小时运行一次DoWork()方法。
  • 外部程序也可以调用公开的方法,该方法调用DoWork()方法。如果服务已经在运行从服务调用的方法,则在当前方法结束后将再次调用DoWork()

解决这个问题的最佳方法是什么?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-20 15:14:59

如果应用程序的目的仅是每六个小时运行一次特定任务,则最好创建命令行应用程序并创建Windows自动运行的计划任务。显然,您可以手动启动这个应用程序。

如果您仍然确信您需要一项服务(老实说,据我迄今所见,您似乎并不需要),您应该考虑使用计时器,但是要仔细选择计时器,并阅读这篇文章以更好地理解.NET中内置的计时器(提示:密切关注System.Timers.Timer)。

若要防止在进程执行其操作过程中另一个方法试图调用DoWork(),请考虑使用互斥信号量

票数 5
EN

Stack Overflow用户

发布于 2011-11-20 15:12:04

另一种方法是使用控制台应用程序,该应用程序可以由Windows任务调度程序安排每6小时运行一次。在这种情况下,您不会浪费资源来使Windows服务始终运行,而是只在需要时使用资源。

对于第二个问题:当您采用控制台应用程序方法时,可以通过使用Process.Start来调用它。

票数 7
EN

Stack Overflow用户

发布于 2011-11-20 15:38:10

无论哪种方式,都有好处和缺点。我倾向于选择windows服务,因为它使您的部署更容易。使用windows任务调度程序调度东西是可编写脚本的,可以自动部署到新的机器/环境,但它仍然比仅仅部署和安装windows服务更不标准。您还需要确保任务调度程序在一个帐户下运行,该帐户可以进行webservice调用,并且您不会遇到密码过期和计划任务突然不运行的问题。但是,对于windows服务,您需要进行某种检查,以确保它始终处于运行状态,并且如果它重新启动,则不会丢失hte状态,这会让它知道何时应该运行。

您可以考虑的另一个选择是使用nservicebus sagas。sagas实际上不仅仅用于调度任务(对于持续时间超过单个请求/消息的工作流类型流程,它们具有持久状态),但它们有一种处理周期性或基于时间的流程(这是长期运行工作流的很大一部分)的好方法。在这种情况下,一个传奇可以要求它在请求的时间从超时管理器返回一条消息。使用nservicebus是一个更大的体系结构问题,并且可能远远超出了您在这里所要求的范围,但是sagas已经成为了我对周期性过程的看法,它带来的额外好处是能够为您的流程管理一些持久的状态(这可能是一个关注的问题,也可能不是一个关注的问题),并且给您一个思考一些可能您以前没有考虑过的体系结构问题的理由。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8202395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档