我有最简单的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
答案 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)