2012-07-09 93 views
1

我已经写在C#中的Windows服务来记录所有用户登录和注销,并在表保存在服务器上。的Windows服务的调用OnStop()方法不会被调用

我已经使用了while循环与true条件和检查在这个循环中的每一分钟系统的当前用户,所以我的服务去“开始”的状态,当我把我的系统上。

一切顺利了这里,但问题是,当我关闭我的系统的OnStop()方法不会被调用。我知道,这个问题是关于服务的状态启动时,因为当我在评论我的服务的OnStart()方法while循环中,OnStop()方法将得到正确执行。

+0

我觉得无限while循环是一个促进的行为。也许你应该使用一个定时器,每隔1分钟后触发 – 2012-07-09 05:20:51

+0

我已经使用定时器(带定时器控制和代码),但即使服务没有启动。在我大量的搜索中,我发现Windows服务已经一些计时器的问题,并不适用于它。 – 2012-07-09 05:33:51

回答

4

的的OnStart(和调用OnStop)不以加工的,由 - 它们被设计来初始化服务,然后完成。我通常做的是创建一个单独的thread(这是在创建TPL之前),启动线程并完成。

在你的情况,则该线程将随后启动一个定时器,并等待停止信号,这可以从调用OnStop方法时,服务将停止发送。当停止信号到达时,它应该停止定时器。

+1

嗨马尔滕,谢谢你的快速回复。我试过你的解决方案,但OnStop()方法没有成功。 – 2012-07-09 08:17:45

+0

我在等你的回复,请帮助我。 – 2012-07-10 04:19:08

+0

OnStop方法会发生什么?抛出异常吗? – Maarten 2012-07-10 07:58:50

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