2016-09-21 183 views
-4

我已經在C#中創建了一個控制檯應用程序。我怎麼知道它是否崩潰並再次運行?如何運行C#控制檯應用程序(如果崩潰)

+0

你運行它。如果它意外消失,它會崩潰。:-)。但是,嚴肅地說,你是什麼意思? –

+0

您可以從使用System.Diagnostics的其他應用程序啓動,也可以使用Windows任務計劃程序啓動它。我們需要一些更多的信息才能更有幫助 –

+2

您的控制檯應用程序是否返回零以外的「成功」退出代碼。然後編寫一個啓動程序啓動它,然後等待它退出。如果退出代碼不是特殊的「成功」代碼,請再次啓動控制檯應用程序。 –

回答

0

你可以嘗試這樣的事:

static void Main(string[] args) 
{ 
    try 
    { 
     // Application code goes here 
    } 
    catch (Exception) 
    { 
     var applicationPath = System.Reflection.Assembly.GetExecutingAssembly().Location; 
     Process.Start(applicationPath); 
     Environment.Exit(Environment.ExitCode); 
    } 
} 

基本上,包裝所有的代碼在try/catch,如果任何異常發生時,程序將與System.Reflection.Assembly.GetExecutingAssembly().Location;檢索.exe位置,然後調用Process.Start運行再次申請。

+0

我寧願處理AppDomain.CurrentDomain.UnhandledException事件,而不是此解決方案。因此,您可以在可以從中恢復的情況下使用try/catch。 –

+0

如果發生堆棧溢出或超出記憶異常等異常,此功能將不起作用 –

+0

在異常情況下物理退出和重新啓動有什麼意義? – ThePerplexedOne

0

您應該從另一個應用程序(看門狗,sheduler,procmon,servman,...)控制您的控制檯應用程序。

E.g.您可以將您的控制檯應用程序創建爲服務並通過服務管理器進行控制。

1
  1. 您可以使用一個看門狗處理您的顯示器,並重新啓動它,如果墜毀: 見:What's the best way to watchdog a desktop application?

  2. 您可以使用Windows服務,而不是和設置它的恢復選項,如下所示:https://serverfault.com/questions/48600/how-can-i-automatically-restart-a-windows-service-if-it-crashes

  3. 您可以使用任務管理器中的計劃任務定期啓動應用程序,並將其設置爲僅在上次運行已結束時才啓動: https://support.microsoft.com/en-us/kb/323527

2

如果我正確理解您的問題,您希望在發生崩潰時嘗試重新啓動控制檯應用程序。在C#console-apps中,定義爲入口點的方法(通常爲static void main)是應用程序中調用堆棧的根。您基本上需要遞歸調用該方法。如果應用程序處於某種意外或不可恢復的狀態,您將需要確保應用程序最終失敗。

例如,在主類:

static int retryCount; 
const int numberOfRetries = 3; 
static void Main(string[] args) 
{ 
    try 
    { 
     var theApp = new MyApplicationType(args); 
     theApp.StartMyAppLogic(); 
    } 
    catch (ExpectedExceptionType expectThisTypeOfException) 
    { 
     thisMethodHandlesExceptions(expectThisTypeOfException); 
    } 
    catch (AnotherExpectedExceptionType alsoExpectThisTypeOfException) 
    { 
     thisMethodHandlesExceptions(alsoExpectThisTypeOfException); 
    } 
    catch (Exception unexpectedException) 
    { 
     if(retryCount < numberOfRetries) 
     { 
      retryCount++;   
      Main(args); 
     } 
     else 
     { 
      throw; 
     } 
    } 
} 
+0

感謝您修復我的錯誤代碼@FrédéricHamidi! –

+0

沒問題。這不是*那*不好;) –

相關問題