Служба не вызывает OnShutdown () при выключении Windows - PullRequest
0 голосов
/ 25 июня 2019

У меня есть консольное приложение ядра .net, которое размещается как служба Windows.
Я хочу поймать событие, если пользователь выходит из системы / выключает компьютер.

Я нашел способы перехватить это событие в .net framework ( здесь & здесь ).
Но я не могу понять, как этого добиться в ядре .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 голосов
/ 25 июня 2019

По своей сути ядро ​​dotnet не «дружит» с вещами, специфичными для платформы (мне кажется, как прослушивание события выхода из системы).

Описано решение, которое я использую в одной из служб на базе Windows здесь .

Когда домен приложения закрывается операционной системой при завершении работы - есть место для использования обработчиков событий AppDomain.

0 голосов
/ 25 июня 2019

Согласно aspisof.net , вы должны иметь возможность использовать SessionEnding API. Это связано с тем, что он указан как доступный в Windows Compatibility Pack - доступен на NuGet здесь .

В этой статье на docs.microsoft.com показано, как ее можно включить в приложение .NET Core.


Т.Л., др

  1. Добавить пакет NuGet
  2. Только для Windows

Одна вещь, на которую следует обратить внимание: изначально она была разработана для временного исправления при переносе специфического кода Windows .NET на .NET Core.

Более приемлемый способ реализации только функций Windows - переместить как можно больше кода в .NET Standard библиотек , насколько это возможно, и использовать директивы условной компиляции для включения кода, специфичного для платформы, когда здание для этой платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...