Windows服务在关闭时从不调用OnStop()方法

时间:2017-03-09 14:04:51

标签: c#

我有最简单的Windows服务。

我需要在本地系统帐户下运行服务。

如果我从SCM启动/停止服务,一切正常,我的日志文本文件同时包含Start和Stop事件,并且事件查看器中也会自动显示Start和Stop事件。

当我重新启动或关闭我的电脑时(尝试使用Win 7和Win 10), OnStop()方法永远不会被调用,如果服务以运行本地系统帐户。如果我将帐户更改为网络服务或任何其他本地/域帐户,则在重新启动/关闭PC之前调用OnStop()方法。

Windows服务代码:

using System.IO;
using System.ServiceProcess;

namespace SimplestService
{
    class MyService : ServiceBase
    {
        private string path = "<pathtologfile>\\MyServiceLog.txt";

        public MyService()
        {
            this.ServiceName = "MyService";
            this.CanShutdown = true;
        }

        protected override void OnStart(string[] args)
        {
            using (StreamWriter sw = File.AppendText(path))
            {
                sw.WriteLine("MyService Started.");
            }
        }

        protected override void OnStop()
        {
            using (StreamWriter sw = File.AppendText(path))
            {
                sw.WriteLine("MyService Stopped.");
            }
        }

        protected override void OnShutdown()
        {
            OnStop();
        }
    }
}

和主要条目:

using System.ServiceProcess;

namespace SimplestService
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceBase.Run(new MyService());
        }
    }
}

为了简单起见,我使用SC实用程序来创建服务,即使我尝试使用Installer,甚至设置项目(msi),但结果相同。

sc create MyService binPath= "<pathtoexe>\SimplestService.exe"
type= own start= auto DisplayName= Myservice

2 个答案:

答案 0 :(得分:2)

根据我的研究,当操作系统关闭时会调用OnShutdown方法,但是存在严格的时间限制,但我相信本地系统服务甚至在此时间限制之前就已终止,因此操作系统关闭时间很快。这可以解释为什么域帐户关闭速度较慢。 Windows已经引入了PreShutdown事件来处理这个问题。 请尝试以下链接,它有更多相关信息 https://www.atomia.com/2011/11/16/how-to-process-the-preshutdown-event-in-a-managed-windows-service/

答案 1 :(得分:1)

Microsoft Windows添加了一个名为Fast Startup的选项,该选项实际上并未关闭计算机。

Fast Startup设置说明中所述,Restart不受影响。这就是Restart触发OnShutdownShutdown不会触发的原因。

关闭Fast Startup会同时触发OnShutdownRestart的{​​{1}}。

Power Options System Settings