2009-02-08 108 views
11

如何檢測我的.NET應用程序崩潰,然後重新啓動?檢測並重新啓動崩潰的.NET應用程序

+0

我發現這個問題的一些解決方案(之前我問),所以我認爲這將是很好的答案在SO。如果您有其他答案,請成爲我的客人。或者只是投票指導其他人的最佳答案。如果您認爲合適,請重新提交此問題。 – 2009-02-08 14:43:15

+0

添加了關於重新啓動控制檯應用程序的信息,因爲這顯然是您正在使用的。 – RoadWarrior 2009-02-09 09:30:35

回答

14

另一種解決方案(基於this example)是創建控制應用程序的啓動:

class LauncherProgram 
{ 
    static int count = 3; 

    static void Main() 
    { 
     Launch(); 
     Thread.Sleep(Timeout.Infinite); 
    } 

    static void Launch() 
    { 
     Process process = new Process(); 
     process.StartInfo.FileName = "MyApp.exe"; 
     process.EnableRaisingEvents = true; 
     process.Exited += LaunchIfCrashed; 
    } 

    static void LaunchIfCrashed(object o, EventArgs e) 
    { 
     Process process = (Process) o; 
     if (process.ExitCode != 0) 
     { 
      if (count-- > 0) // restart at max count times 
       Launch(); 
      else 
       Environment.Exit(process.ExitCode); 
     } 
     else 
     { 
      Environment.Exit(0); 
     } 
    } 
+1

唯一可能的升級方法是將「看門狗」設置爲Windows服務。 – 2009-02-08 15:02:10

+0

更好地添加一些時間戳代碼並檢測應用程序是否在啓動時崩潰 – Sean 2014-08-06 01:45:39

1

一個可能的解決方案是創建另一個進程監視應用程序,並重新啓動它,如果它被終止:

class ProcessMonitorProgram 
{ 
    const string myProcess = "MyApp.exe"; 

    static void Main() 
    { 
     new Timer(CheckProcess, null, 0, 60 * 1000); 
     Thread.Sleep(Timeout.Infinite); 
    } 

    static void CheckProcess(object obj) 
    { 
     if (Process.GetProcessesByName(myProcess).Length == 0) 
      Process.Start(myProcess); 
    } 
} 

一個與此解決方案的問題是,它會保持進程重啓永遠,直到這個監控應用程序本身被終止。

5
  • 運行一個AppDomain內的工作;使用主AppDomain來監視它(雖然不防止進程kill)
  • 大量的異常處理!即不要讓一個致命的錯誤推倒過程
  • 在一些已經有內置的循環來看,這 - IIS例如
8

如果這是一個Windows窗體應用程序:

  • 套裝jitDebugging = true in App.Config。這可以防止內置的Windows窗體未處理的異常處理程序被觸發。

現在無論這是一個Windows窗體應用程序或一個控制檯應用程序:

  • 註冊爲Application.ThreadException事件,例如在C#中:

    Application.ThreadException + = new Threading.ThreadExceptionHandler(CatchFatalException);

此時,您的應用程序已進入黑洞。接下來會發生什麼取決於這是否是一個Windows窗體應用程序:如果它是一個Windows窗體應用程序