Windows关闭时服务未调用OnShutdown()

时间:2019-06-25 08:16:01

标签: asp.net-core windows-services asp.net-core-2.2

我有.net核心控制台应用程序,该应用程序托管为Windows服务。
如果用户注销/关闭计算机,我想捕获一个事件。

我已经找到了在.net框架(herehere)中捕获此事件的方法。
但是我不知道如何在.net核心中实现这一目标。

要创建服务,我正在使用“ ServiceBase”类。示例代码如下:

public class MyService : ServiceBase
{
    readonly string LogPath = "D:\\TestAppService.txt";

    #region Constructors
    public MyService()
    {
        this.CanShutdown = true;
    }
    #endregion

    #region Protected Functions
    protected override void OnStart(string[] args)
    {
        //your code here

        // call the base class so it has a chance
        // to perform any work it needs to
        base.OnStart(args);
    }

    protected override void OnStop()
    {
        //your code here

        // Call the base class 
        base.OnStop();
    }

    protected override void OnShutdown()
    {
        using (StreamWriter sw = File.AppendText(LogPath))
        {
            sw.WriteLine("shutdown == true");
        }

        //your code here
        base.OnShutdown();
    }
    #endregion
}  

正在调用OnStop和OnStart方法。
但是,当我关闭计算机时,不会调用OnShutdown方法。

2 个答案:

答案 0 :(得分:0)

根据aspisof.net,您应该可以使用SessionEnding API。这是因为它被列为windows Compatibility Pack中公开的-在NuGet here上可用。

docs.microsoft.com上的

This article显示了如何将其包含在.NET Core应用程序中。


tl; dr

  1. 添加NuGet包
  2. 仅定位Windows

需要注意的一件事:最初是为了将Windows特定的.NET代码移植到.NET Core上的临时修复程序。

更受认可的仅实现Windows功能的方法是将尽可能多的代码移至.NET Standard libraries,并在为该平台构建代码时使用conditional compilation directives包括平台特定的代码。

答案 1 :(得分:0)

通过设计,dotnet核心与平台特定的内容不“友好” (就像在我看来听注销事件一样。)

here描述了我在Windows托管服务之一中使用的解决方案。

当操作系统在关闭时被迫关闭应用程序域时-有使用AppDomain事件处理程序的空间。