Как сделать так, чтобы служба Windows запускала некоторый код, если его пришлось перезапустить после сбоя?

Допустим, служба Windows аварийно завершает работу и автоматически перезапускается из-за некоторых параметров восстановления. Я хочу запустить некоторый код в программе (C#), который будет выполнять некоторые сетевые действия (отправлять оповещение о том, что он выключен) всякий раз, когда это происходит.

Есть ли событие, которое я могу применить, или код, который я могу запустить после этого?

Спасибо!

2 ответа

Решение

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

public partial class MyAppService : ServiceBase
{
    protected override void OnStart(string[] args)
    {
        if(File.Exists(Path.Combine(Path.GetTempPath(), "MyAppIsRunning.doNotDelete"))
        {
            DoSomthingBecauseWeHadABadShutdown();
        }
        File.WriteAllText(Path.Combine(Path.GetTempPath(), "MyAppIsRunning.doNotDelete"), "");
        RunRestOfCode();
    }

    protected override void OnStop()
    {
        File.Delete(Path.Combine(Path.GetTempPath(), "MyAppIsRunning.doNotDelete"));
    }

    //...
}

Это может легко заменить файл с записью в реестре или записью в базе данных.

Вы можете подписаться на событие ниже, которое сработает независимо от того, в каком потоке возникнет исключение.

AppDomain.CurrentDomain.UnhandledException

Пример реализации

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
 // log the exception ...
}
Другие вопросы по тегам