我目前正在開發一個小遊戲服務器,它有一個「模擬器」。有時候它會崩潰,用戶需要等到我下班後才能開始工作,所以我想詢問是否有人知道,如果有一種方法可以自動重新啓動.exe(其中有3個),如果它崩潰了,那麼如果程序顯示「...停止工作」。C#:自動重啓程序
有人幫我嗎?
我目前正在開發一個小遊戲服務器,它有一個「模擬器」。有時候它會崩潰,用戶需要等到我下班後才能開始工作,所以我想詢問是否有人知道,如果有一種方法可以自動重新啓動.exe(其中有3個),如果它崩潰了,那麼如果程序顯示「...停止工作」。C#:自動重啓程序
有人幫我嗎?
你可以編寫一個簡單的批處理文件來檢查exe主函數(退出代碼)的返回值。
或者只是編寫一個簡單的程序,以Process.Start
開頭,如果它沒有運行 - >枚舉並檢查Process.GetProcesses()
。
如果'服務器'本身沒有提供編程的服務,你也可以創建一個服務。
有很多選擇......
站在沉船,這是很難從下沉的船救自己......你最好的賭注是第二個過程中,某種看門狗檢查是否應用仍然活着,如果沒有,它會自動啓動它。
您可以枚舉通過調用
System.Diagnostics.Process.GetProcesses
訂閱Process.Exited
事件,當它退出重新啓動它正在運行的進程:
var proc = Process.GetProcessesByName("my-server").Single();
proc.EnableRaisingEvents = true;
proc.Exited += (a, e) =>
{
proc = Process.Start(...); // Restart the process
};
有多種方法可以做到這一點 銘記你有您的檢查條件提前檢查 例如
If(stopped working){
ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C ping 127.0.0.1 -n 2 && \"" + Application.ExecutablePath
+ "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Application.Exit();
}
另一種方式是
If(stopped working){
Application.Restart();
}
另一種方式是
If(stopped working){
Process.Start(Application.ExecutablePath);
}
A「的小遊戲** **服務器」可能應該是一個Windows服務,它有內置的自動重啓對崩潰。 – Fildor
...外面,你可能應該修復崩潰;) – Fildor
_該程序說:「...停止工作」_如果程序不**完全**退出,你可能不得不周期列舉窗口的路線爲該錯誤消息的存在,然後殺死並重新啓動應用程序。查找使用'EnumWindows()'的例子,就像在[this thread]中一樣(https://stackoverflow.com/questions/19867402/how-can-i-use-enumwindows-to-find-windows-with-a-specific-標題標題)。你也可以使用FindWindow()來通過**類型**來搜索那個錯誤信息。 –