【发布时间】:2010-11-16 17:26:10
【问题描述】:
我继承了一个用 C# 编写的 Windows 服务。在极少数情况下,它会严重失败。但是,完全不知道如何很好地失败。 Ross Bennett 在bytes.com 上优雅地陈述了这个问题。为简单起见,我将在这里引用他。
嘿,伙计们!
我一直在寻找这个, 但我似乎无法动摇 来自 MSDN 或来自 谷歌。我审查了每个 .NET 关于开发 Windows 服务的文章 在我找到的 MSDN 中。
我正在开发 Windows 服务 应用。该服务读取其 来自系统的配置数据 登记处 (HKLM) 由另一个“经理”应用程序。不 有问题。
服务使用工作线程来做 是工作。线程是在 OnStart() 和信号/加入/处置 在 OnStop() 中。同样,没有问题。
在以下情况下一切都很好:
- 系统管理员已正确设置所有内容,并且
- 外网资源均可达。
当然,我们作为开发人员只是 不能依赖:
- 系统管理员已正确设置所有内容,或
- 可以访问的外部网络资源。
真的,我们需要的是 服务申请有办法 自己死去。如果一个网络 资源下降,我们需要 服务停止。但更多的是 点,我们需要 SCM 知道它有 自行停止。单片机需求 知道该服务有 “失败”……而且不只是被关闭 被某人击倒。
调用“return”或抛出一个 “OnStart()”方法中的异常 甚至对服务都没有帮助 在启动过程中..单片机去 快乐地进行,过程不断 在任务管理器中运行——尽管 它实际上并没有做任何事情,因为 从未创建工作线程 并开始了。
使用 ServiceController 实例 也不这样做。这似乎 将 SCM 作为正常关机——而不是 服务失败。所以没有一个 恢复操作或重新启动发生。 (另外,还有 MSDNful 文档 警告 ServiceBase 后代使用 ServiceController 做事 自己发生。)
我读过人们在哪里的文章 搞乱 PInvoking 调用 本机代码只是为了设置 SCM 中的“已停止”状态标志。但 不会关闭进程 服务正在内部运行。
我真的很想知道 方式:
- 从服务内关闭服务,其中
- 适当地通知 SCM 服务已“停止”,并且
- 该进程从任务管理器中消失。
涉及 ServiceController 的解决方案 似乎不合适,如果只是 因为2不满足。 (那个 专门的框架文档 禁忌这样做 顺便说一句,重量很大。)
如果有任何建议,我将不胜感激, 指向文档的指针,甚至 有道理的猜想。 :-) 哦!和 我很高兴能接受 我没有抓住重点。
最诚挚的,
罗斯·贝内特
【问题讨论】:
标签: c# windows-services