2010-02-11 69 views
3

我是新来的Windows服务,所以请原谅这篇文章的基本性质。如何保持一个Windows服务(.Net)

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

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

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

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

这些文件中创建的事件是非常稀少的,所以我看不出任何循环会如此忙碌保持运行所有的时间。通过这种逻辑,服务应该停止,或者我会这么想。但它永远不会,它始终在运行。

是否有在保持它走,直到调用OnStop或暂停事件被触发Windows服务的一些无形的消息泵?

我希望这是有道理的,并且道歉,如果我的描述没有。如果您认为这可能会有所帮助,我很乐意详细阐述。感谢您在这里的解释。

回答

2

你不需要那个循环。

考虑您的业务类创建FileSystemWatcher,并签署了它的活动,和所有其他的东西,你的需要。

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

ServiceBase.OnStop覆盖,你会清理任何你需要的东西。

就是这样。你不需要处理后台线程或其他任何东西。

+0

谢谢你(你也是,凯文!)我能问一下保持服务进行的是什么,它是什么样的Windows窗体 - 就像服务启动时产生的“隐藏线程”? – larryq 2010-02-11 07:25:05

+0

不是一个线程,而是一个过程;如果打开yoir任务管理器并选择服务选项卡 – 2010-02-11 09:05:02

+1

服务进程有一个线程,则可以看到程序正在运行。所以是的,有一个线程,但不是直接在你的控制之下的线程。在大多数情况下,主服务线程调用OnStart,程序员在那个时候启动他们自己的线程。当主线程调用OnStop时,它们关闭它们启动的工作线程。在你的情况下,FileSystemWatcher启动它自己的线程,所以你不需要它。 – 2010-02-11 21:52:23

1

FileSystemWatcher事件回调发生在与系统线程池分离的线程中。所以即使创建观察者的线程死亡事件仍然会发生。