2014-04-08 77 views
4

我有一個小的,長期運行的,嵌入的,NETMF程序停止不明原因(見How do we trouble shoot a long-running NETMF program that stops in production?)。作爲一種解決方法,我希望它在失敗時自動重啓。我的感覺是,try-catch塊可以做到這一點。怎麼樣?這甚至有可能嗎?有更好的方法嗎?如何重新啓動嵌入式NETMF C#程序時出錯?

public class Program 
{ 
    private static Timer timer;  
    public static void Main() 
    { 
     Program p = new Program(); 

     Program.timer = 
      new Timer(this.TimerCallback_DoSomething, new object(), 0, 1000); 

     Thread.Sleep(Timeout.Infinite); 
    } 

    private void TimerCallback_DoSomething(object stateInfo) 
    { 
     // do something 
    } 
} 
+1

如果您將此作爲服務運行,您可以讓服務在出現故障時自動重啓。 – David

+0

對於最穩定的方法,這應該作爲一個DOS批處理文件來完成,該文件在存在非零結果時重新啓動程序。 – cgTag

+0

@PhatWrat這是一個嵌入式的NETMF程序,所以我認爲服務是不可能的。我更新了我的問題以強調這一點。 –

回答

3

在這個線程中有一些很好的建議。

Detecting and restarting my crashed .NET application

例如,您可以爲Application.ThreadException註冊事件,然後處理使用的應用程序的API恢復應用程序重新啓動(需要的P/Invoke)。

http://community.bartdesmet.net/blogs/bart/archive/2006/11/11/Windows-Vista-Application-Recovery-with-C_2300_.aspx

[MSDN] Understanding Application Recovery and Restart

+0

如果您發現一個重複的問題,您應該標記/投票以重複關閉,而不是在答案中發佈重複鏈接。 – Servy

+0

不可靠,這不一定開始。不知道發生了什麼 - 可能無法觸發。 – TomTom

+1

我會從這個問題中提出與Marc Gravell相同的建議 - 在單獨的AppDomain中加載應用程序並監視其關閉。它不需要額外的流程,所以應該適用於大多數情況。 – Snixtor

1

無論您可以在同一應用程序通過一個簡單的try/catch做到這一點取決於被拋出什麼樣的異常。我會採取最壞的情況,並說該應用程序無法挽回地丟失。

有第二個應用程序在停止時重新啓動第一個應用程序。在粗略代碼:

Process p = new Process(); 
p.Exited += StartItAgain; 
// other setup 
p.Start(); 
+0

我的理解是,NETMF一次只能運行一個應用程序。我明白,原來的問題並不清楚,並已更新。 –

1

如果你不知道什麼會導致應用粉碎,這意味着你可以不處理您可能需要Windows服務來重新啓動應用程序的異常。

+0

一臺計算機上的Windows服務可以通過局域網在另一臺計算機上啓動應用程序嗎? –

+1

不,使用Windows服務我不認爲這是可能的,但您可以使用WCF服務來完成。 – Pantelis

1

我同意.net中的Pantelis,您必須處理您的異常,如果您不知道錯誤來自何處,那麼您必須使用UnhandledException來處理該問題。

我不認爲重新啓動應用程序將解決您的問題,它會隱藏自己的問題,但如果你喜歡做的事,有很多方法可以做到這一點:

  • 在嘗試捕捉啓動進程再次。
  • 在UnhandledException中啓動應用程序。
  • 錯誤代碼在異常和應用程序存在時事件檢查錯誤代碼,如果錯誤代碼不爲0,則重新啓動應用程序。
相關問題