2016-02-22 4 views
1

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

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

Спасибо!

ответ

3

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

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")); 
    } 

    //... 
} 

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

2

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

AppDomain.CurrentDomain.UnhandledException

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

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

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
// log the exception ... 
}