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

Mat*_*han 5 c# windows-services onstart

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

P D*_*ddy 5

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

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

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

在任何这些情况下,您的服务任务都是异步执行的,您可以立即退出OnStart.但记得要保持你的线程,定时器的TcpListener,或任何的轨道,这样就可以在调用OnStop与它互动(和可选的onPause和OnContinue).通常要做的是处理任何计时器(因此它们不会再触发),关闭任何套接字或监听器,然后设置ManualResetEvent.您运行的任何线程都应定期检查此事件,并在发出信号后退出.如果要确保成功关闭服务并确保可能的数据丢失风险,您可以加入任何正在运行的线程,并且具有合理的超时(通常为30秒),然后在超时到期后中止仍在运行的所有线程.


Kir*_*rst 3

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

“Windows 服务”项目应该只包含启动服务的样板内容、属于服务一部分的任何计时器等等。将其余部分放在另一个项目中,以便您稍后可以在桌面应用程序、Web 应用程序、WCF 服务等中使用业务逻辑。