如何保持Windows服务(.Net)

时间:2010-02-11 00:21:53

标签: .net windows-services

我是Windows服务的新手,所以原谅这篇文章的基本性质。

我的任务是更新现有服务,并对如何工作并在后台继续运行有一些疑问。我假设某种循环通常在起作用,但在下面的情况下,我不确定它是如何工作的以及为什么它不会在很短的时间内停止。

简而言之,此服务在其InitializeComponent()部分中创建一个System.IO.FileSystemWatcher对象,并为其Created事件建立一个事件处理程序。

在服务的OnStart方法()中,创建并启动一个线程。该线程循环并指示FileSystemWatcher对象查看特定目录,并为FileSystemWatcher建立各种设置和选项。它无论如何都不是无限的while()循环;它做了一些涉及用户提供的超时值和睡眠等待时间的数学运算,但在每种情况下都会最终退出。

上面提到的FileSystemWatcher事件处理程序反过来将触发事件的新创建的文件放入线程安全的队列,然后创建新的或使用现有的线程来处理排队的文件。队列处理代码使用循环来检查队列并从中删除任何项目并处理它们。当队列中没有项目时,while循环结束,方法退出。

这些文件创建的事件相当少,所以我无法看到任何一个循环如此繁忙以至于一直保持运行。通过这种逻辑,服务应该停止,或者我认为。但它永远不会,它总是在运行。

在Windows服务中是否存在一些不可见的消息泵,直到OnStop或暂停事件被触发为止?

我希望这是有道理的,如果我的描述没有,我会道歉。如果您认为它可能有所帮助,我会很乐意进一步阐述。谢谢你的解释。

2 个答案:

答案 0 :(得分:2)

你不需要那个循环。

考虑您的商家类创建FileSystemWatcher并签署活动,以及您需要的所有其他内容。

ServiceBase.OnStart覆盖时,您将从业务类创建一个实例,并将其放入类级别变量(例如,一个字段)。

ServiceBase.OnStop覆盖时,您将清除所需的任何内容。

就是这样。您不需要处理后台线程或其他任何内容。

答案 1 :(得分:1)

FileSystemWatcher事件回调发生在与系统线程池不同的线程中。因此,即使创建观察者的线程死亡,事件仍然会发生。