Jak wykryć, że moja aplikacja .NET uległa awarii, a następnie ponownie uruchomić?Wykrywanie i ponowne uruchamianie uszkodzonej aplikacji .NET
Odpowiedz
Innym rozwiązaniem (na podstawie this example) jest stworzenie wyrzutnię, która kontroluje aplikację:
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);
}
}
Jedynym możliwym ulepszeniem byłoby uczynienie z "watchdoga" usługi Windows. –
lepiej dodać kod znacznika czasowego i wykryć, czy aplikacja uległa awarii podczas uruchamiania – Sean
Możliwym rozwiązaniem jest stworzenie innego procesu, aby monitorować aplikację i uruchomić ją ponownie, jeśli jest rozwiązana:
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);
}
}
Jednym z problemów, z tego rozwiązania jest to, że będzie na bieżąco proces ponownego uruchamiania zawsze, aż ta aplikacja monitorująca została zakończona.
- uruchomienia prac wewnątrz AppDomain; użyj głównej AppDomain do monitorowania (nie chroni przed zabiciem procesu).
- wiele wyjątków! czyli nie daj błąd krytyczny zburzyć proces
- uruchomić go w coś, co ma już wbudowany w recyklingu - IIS na przykład
Dzięki Marc. Czy mógłbyś dodać przykład, jak zaimplementować proponowane rozwiązanie oparte na AppDomain? –
Zakładając, że jest to aplikacja Windows Forms lub konsola, możesz użyć Application.Restart - zobacz moją odpowiedź, by poznać szczegóły. – RoadWarrior
Jeśli jest to Windows Forms aplikacji:
- Set jitDebugging = true w App.Config. Zapobiega to uruchomieniu wbudowanego programu obsługi formularzy nieobsługiwanego formularza Windows Forms.
Teraz, niezależnie od tego, czy jest to aplikacja Windows Forms lub aplikację konsoli:
rejestracji na Application.ThreadException zdarzenia, na przykład w języku C#:
Application.ThreadException + = new Threading.ThreadExceptionHandler (CatchFatalException);
W tym momencie Twoja aplikacja jest już w drodze do czarnej dziury. Co dzieje się dalej, zależy od tego, czy jest to aplikacja Windows Forms:
- Jeśli jest to Windows Forms aplikacji, należy wywołać metodę Application.Restart w swojej obsługi zdarzeń CatchFatalException.
- W przeciwnym razie konieczne będzie p/wywołanie funkcji macierzystych application restart and recovery. Ten link omawia Vista, ale w moich testach działa dobrze na XP.
Dziękuję. Czy aplikacja konsolowa może zrobić coś podobnego do 'Application.ThreadException + = MyHandler;'? –
Tak, aplikacja konsoli może zrobić to samo. – RoadWarrior
Ale nie ma dostępu do klasy Application, prawda? –
- 1. Forever.js uruchamianie i ponowne uruchamianie wielu skryptów
- 2. Ponowne użycie ikony aplikacji .NET
- 3. Ponowne uruchamianie scenariusza WPF
- 4. Ponowne uruchamianie Sidekiq
- 5. Emulator Android przyspiesza ponowne uruchamianie
- 6. Ponowne uruchamianie zakończone niepowodzeniem i niezalecane testy
- 7. Odtwarzanie dźwięku i ponowne uruchamianie onclick
- 8. Ponowne uruchamianie procesu erlang i zachowanie stanu
- 9. phpunit ponowne uruchamianie testów losowo
- 10. Prawidłowa obsługa ponownego ładowania i ponowne uruchamianie z AppletViewer
- 11. Wykrywanie proxy .NET
- 12. Formanty javascript wideo HTML5 - ponowne uruchamianie wideo
- 13. Automatyczne ponowne uruchamianie długich zadań w Julia
- 14. Ponowne uruchamianie menedżera jednostek z wyjątków
- 15. Windows - Zapobieganie awariom "Sprawdzanie rozwiązania ..." i "Ponowne uruchamianie programu ..."
- 16. Jak tolerować ponowne uruchamianie RabbitMQ w Langohr?
- 17. Wykrywanie WiX .Net 4.0.3
- 18. Ponowne uruchamianie crona po zmianie pliku crontab?
- 19. Ponowne uruchamianie zdalnych ziaren przy użyciu IPython.parallel
- 20. Ponowne uruchamianie demona dropboxa, jeśli działa
- 21. Ponowne uruchamianie serwera lotniczego czytającego starszą wartość
- 22. Wysyłanie aplikacji na tło i ponowne jej uruchamianie od czasu do czasu w XCTest
- 23. Uruchamianie aplikacji .NET w systemie Linux w 2015 r.
- 24. Uruchamianie PowerShell z .NET Core
- 25. Zadanie w tle i wykrywanie uruchomionej aplikacji
- 26. Wykrywanie "Błąd 106 net :: ERR_INTERNET_DISCONNECTED)"
- 27. Uruchamianie aplikacji na iPhone'a i iPada
- 28. Wykrywanie uruchomienia aplikacji
- 29. Wykrywanie pierwszego uruchomienia aplikacji
- 30. Uruchamianie Facetime z aplikacji?
Znalazłem rozwiązania tego pytania (zanim je zadałem), więc pomyślałem, że byłoby miło mieć odpowiedzi w SO. Jeśli masz dodatkowe odpowiedzi, bądź moim gościem. Lub po prostu wybierz najlepszą odpowiedź, aby poprowadzić innych. Prosimy również o ponowne rozpatrzenie tego pytania, jeśli uznasz to za stosowne. –
Dodano informacje o ponownym uruchomieniu aplikacji konsolowej, ponieważ jest to najwyraźniej to, czego używasz. – RoadWarrior