讓我們假設一個Windows服務崩潰,並由於一些恢復選項而自動重啓。我希望在程序(C#)中運行一些代碼,以便在發生這種情況時執行一些網絡操作(發送關閉的警報)。如何讓Windows服務運行一些代碼,如果它不得不在崩潰後重新啓動?
是否有可以應用的事件或可以在發生後運行的代碼?
謝謝!
讓我們假設一個Windows服務崩潰,並由於一些恢復選項而自動重啓。我希望在程序(C#)中運行一些代碼,以便在發生這種情況時執行一些網絡操作(發送關閉的警報)。如何讓Windows服務運行一些代碼,如果它不得不在崩潰後重新啓動?
是否有可以應用的事件或可以在發生後運行的代碼?
謝謝!
在這種情況我會做的是,而不是當程序失敗時寫出來的東西,讓程序寫出一些如果它檢測到乾淨關閉正在完成,那麼它將永久性存儲的記錄類型刪除。
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 ...
}