当前位置:  开发笔记 > 编程语言 > 正文

用.NET编写的服务可以自行终止吗?

如何解决《用.NET编写的服务可以自行终止吗?》经验,为你挑选了3个好方法。

我有一个用C#编写的服务应用程序,在某些情况下,我希望它能自行终止.这将在服务运行一段时间后发生,因此OnStart()事件中不会发生这种情况.

到目前为止,我所阅读的所有内容都表明,终止服务的唯一安全方法是通过服务控制管理器.我的服务作为本地服务运行,并且没有启动或停止服务的权限,因此我无法从服务本身访问SCM.还有另一种自我终止方式,同时仍然按照SCM的规则进行游戏吗?



1> configurator..:

试试ServiceBase.Stop().



2> Martin Liver..:

如果要终止服务而不是停止它(可能是因为服务已经捕获了一个未处理的异常),您可以使用Environment.Exit(1)(如果需要,可以使用另一个退出代码).

Windows将发现该服务意外终止.如果已将服务配置为恢复,则将使用恢复过程,其中包括用于重新启动服务,运行程序或重新启动计算机的选项.


大部分时间都有效.在一些罕见的情况下(可能还有一些终结者仍在运行或某些竞争条件),它会挂起.然后你必须使用Environment.FailFast.所以,我找到的解决方案是 - `ThreadPool.QueueUserWorkItem(ExitImmediate); Environment.Exit(1);`其中ExitImmediate睡眠一段时间然后执行FailFast.

3> Jon Skeet..:

如果你让所有执行的线程完成,会发生什么?我可以想象三种可能的结果:

SCM注意到,并决定你做得恰当

SCM注意到,认为你死了,然后重启你

SCM没有注意到,并显示您仍在运行

编辑:我怀疑这个答案是最好的答案,但我只是为了感兴趣,我会把它(目前)留下来.


这不是一个消息循环.服务控制管理器将主线程置于等待状态并唤醒它以调用控制处理程序回调.当进程中的所有服务都已停止时,它将被释放并返回ServiceBase.Run方法.
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有