Как сделать так, чтобы служба 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 ...
}