C# Windows услуга OnPreShutdown занимает целых 20 секунд - PullRequest
3 голосов
/ 20 марта 2020

Я написал сервис C# windows, работающий под локальной системной учетной записью. Мне нужно что-то сделать, когда система выключается, и подключение к событию перед отключением работает нормально.

Я принимаю команду предварительного отключения, устанавливая правильный флаг:

FieldInfo acceptedCommandsFieldInfo = typeof(ServiceBase).GetField("acceptedCommands", BindingFlags.Instance | BindingFlags.NonPublic);
                if (acceptedCommandsFieldInfo == null)
                {
                    throw new Exception("acceptedCommands field not found");
                }
                int value = (int)acceptedCommandsFieldInfo.GetValue(service);
                acceptedCommandsFieldInfo.SetValue(service, value | SERVICE_ACCEPT_PRESHUTDOWN);

И выполняя мои последние шаги, когда я получаю команду предварительного выключения.

Это работает, я могу выполнять мой лог c каждый раз, я знаю, что событие предварительного отключения дает вам 20 секунд. Моя проблема заключается в следующем: мой код завершается менее чем за 1 секунду (не нужно делать много, я просто должен убедиться, что я делаю это при завершении работы), однако система все еще ожидает моего сервиса fini sh на 20 секунд.

Это можно увидеть, активировав режим "verbose" windows 10, который можно включить, добавив запись реестра "verbosestatus" со значением "1" ( Значение DWORD) по этому пути: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System

Я искал 2 дня и не могу найти способ сообщить системе, что мой код закончил, и он не должен ждать оставшиеся ~ 19 секунд и просто выключиться.

К сожалению, это также требует много времени для тестирования, так как вам нужно выключить свою машину или виртуальную машину, чтобы поймайте этот поток предварительного отключения.

Кто-нибудь сталкивался с этой проблемой? Я предполагаю, что должно быть какое-то событие отмены, но я просто не могу его найти.

...