【问题标题】:How to keep a windows service going (.Net)如何保持 Windows 服务运行 (.Net)
【发布时间】:2010-02-11 09:36:17
【问题描述】:

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

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

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

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

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

这些文件创建的事件很少而且相差甚远,所以我看不出任何一个循环会如此繁忙以至于一直保持运行。按照这种逻辑,服务应该停止,或者我认为。但它永远不会,它总是在运行。

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

我希望这是有道理的,如果我的描述没有,我深表歉意。如果您认为这可能会有所帮助,我很乐意进一步详细说明。感谢您在这里的解释。

【问题讨论】:

    标签: .net windows-services


    【解决方案1】:

    你不需要那个循环。

    考虑您的商务舱创建您的FileSystemWatcher 并为其活动签名,以及您需要的所有其他东西。

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

    ServiceBase.OnStop 覆盖时,您将清除任何您需要的东西。

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

    【讨论】:

    • 谢谢(还有你,Kevin!)我能问一下是什么让服务继续运行吗?是在服务启动时产生的某种类似于 Windows 窗体的“隐藏线程”吗?
    • 不是线程,而是进程;如果您打开 yoir 任务管理器并选择服务选项卡,您可以看到您的程序正在运行
    • 服务进程有线程。所以是的,有一个线程,但不是您直接控制的线程。在大多数情况下,主服务线程调用 OnStart 并且程序员在此时启动他们自己的线程。当主线程调用 OnStop 时,他们会关闭他们启动的工作线程。在你的情况下, FileSystemWatcher 启动它自己的线程,所以你不需要一个。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2013-01-26
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多