在编写Windows服务时,我将大部分代码放在哪里?

时间:2012-08-17 03:57:13

标签: c# windows-services onstart

我正在进入Windows服务并查看一些教程,但他们都非常愚蠢。它们通常涉及在重写的OnStart方法中打印出一些东西。这听起来好像被召唤一次。现在我在哪里放置需要连续运行的代码?

3 个答案:

答案 0 :(得分:5)

服务类中的所有On ...方法应尽快返回。只要Windows服务控制器与您的服务交互,它们就会被调用,服务控制器将等待成功返回。每当您使用服务控制面板小程序并启动或停止服务时,您看到的进度条就是在等待该服务相当于OnStart或OnStop返回时显示的内容。

因此OnStart中的典型操作是以下一项或多项:

  • 启动一个单独的线程,执行您的服务将执行的常量任务
  • 设置一个定时器(System.Threading.Timer种类),定期执行您的服务定期执行的任何操作(可能轮询某个州)
  • 开始在网络端口上异步侦听,可能使用TcpListener或UdpClient
  • 订阅某些系统活动

在上述任何一种情况下,您的服务任务都是异步执行的,您可以立即退出OnStart。但请记住跟踪您的线程,计时器,TcpListener或其他任何内容,以便您可以在OnStop(以及可选的OnPause和OnContinue)中与它进行交互。通常要做的是处理任何计时器(因此它们不会再触发),关闭任何套接字或监听器,然后设置ManualResetEvent。您运行的任何线程都应定期检查此事件,并在发出信号后退出。如果要确保成功关闭服务并确保可能的数据丢失风险,您可以加入任何正在运行的线程,并且具有合理的超时(通常为30秒),然后中止在超时到期后仍在运行的所有线程。 / p>

答案 1 :(得分:3)

与任何其他具有多个类的项目相同 - 您将其放在一个单独的项目中。

“Windows服务”项目应该只包含启动服务的样板文件,作为服务一部分的任何计时器,以及类似的东西。将其余项目放在另一个项目中,您可以在桌面应用程序,Web应用程序,WCF服务等中使用业务逻辑。

答案 2 :(得分:2)

要以正确的方式创建任何Windows服务,我会坚持使用TopShelf库。它对IoC友好,您可以将Windows服务基础结构代码完全与服务逻辑分开。您还可以将该服务作为控制台应用程序运行,并将其转换为生产中的Windows服务。我认为这是创建Windows服务的“方式”,从不回头。