1

我用 C# 编写了一个 Windows 服务来记录所有用户登录和注销,并将它们保存在服务器上的表中。

我使用了一个while带条件的循环,并在这个循环中每分钟检查一次系统的当前用户,所以当我打开我的系统时true,我的服务会进入“正在启动”状态。

到这里一切都很好,但问题是OnStop()当我关闭系统时该方法没有被调用。我知道问题在于服务启动时的状态,因为当我while在服务方法中注释循环时OnStart(),该OnStop()方法将正确执行。

4

2 回答 2

4

OnStart(和 OnStop)不是为了完成而设计的——它们旨在初始化服务,然后完成。我通常做的是创建一个单独的线程(这是在创建TPL之前),启动线程,然后完成。

在您的情况下,线程将启动一个计时器,并等待一个停止信号,该信号可以在服务停止时从 OnStop 方法发送。当停止信号到来时,它应该停止定时器。

于 2012-07-09T05:37:49.047 回答
2

OnStart() 必须返回操作系统,下面是 MSDN 文档,

服务应用程序旨在长时间运行。因此,它通常会轮询或监视系统中的某些内容。在 OnStart 方法中设置监视。但是, OnStart 实际上并不进行监控。 一旦服务的操作开始,OnStart 方法必须返回到操作系统。它不能永远循环或阻塞。


要设置简单的轮询机制,您可以使用 System.Timers.Timer 组件。在 OnStart 方法中,您将在组件上设置参数,然后将 Timer.Enabled 属性设置为 true。然后计时器会定期在您的代码中引发事件,此时您的服务可以进行监控。

http://msdn.microsoft.com/en-us/library/aa984464%28v=vs.71%29.aspx

于 2012-07-09T05:42:37.220 回答