长时间运行的Windows服务

时间:2009-04-12 16:33:59

标签: c# .net windows-services

民间,

我想开发一个运行时间很长的Windows服务(几个月应该没有问题),我想知道这里有什么更好的选择:

  1. 在OnStop方法中使用while(true)循环
  2. 使用计时器每n秒打勾并触发我的代码
  3. 还有其他选择吗?
  4. 由于 埃萨姆

7 个答案:

答案 0 :(得分:6)

我不会做#1。

我要么做#2,要么在OnStart期间脱掉一个单独的线程来完成实际的工作。

答案 1 :(得分:6)

除了#1之外的任何东西 服务经理(或用户,如果他是激活控件的用户)希望OnStart()OnStop()及时返回。
通常做的方法是启动自己的线程来保持事物的运行和循环,听一个可能告诉它停止的事件。

答案 2 :(得分:4)

可能值得考虑间隔时间短的预定任务。节省了编写大量管道代码并处理Windows Services timers的特性。

答案 3 :(得分:2)

不要弄乱服务控制器代码。如果服务想要停止,你只会使用#1来改变问题。而且BTW服务总是崩溃,在这种情况下你的while(true)对你没有帮助。

如果你真的想要一个“运行Windows服务(几个月应该没有问题)”,你最好确保你自己的代码正确和彻底测试使用单元和集成测试之前将其作为服务运行。

答案 4 :(得分:1)

我不推荐#1。

我过去为完全相同的场景/情况所做的是创建一个运行N秒的计划任务,启动一个只执行以下两件事的小脚本:#1检查“IsAlreadyRunning”标志(从数据库读取)#2如果标志为真,则脚本立即停止结束退出。如果标志为false,则脚本在新线程中启动单独的进程(exe)(利用服务执行可能非常短或有时非常长的任务,具体取决于要处理的记录数量)。当然,此过程会设置并重置IsAlreadyRunning标志,以确保线程不会启动重叠的操作。我有一个已经运行多年的服务,这种方法我从来没有遇到任何问题。我的主要流程利用Web服务和其他一些东西来执行一些繁重的备份操作。

答案 5 :(得分:0)

System.Threading.Timer类似乎适合这种用法。

答案 6 :(得分:0)

它在做什么

1清理任务,或

2醒来并查看是否需要运行任务

如果它类似于#2,那么使用MSMQ会更合适。使用MSMQ任务几乎可以立即完成。