Как я могу обнаружить, что мое приложение .NET разбилось, а затем перезапустило его?Обнаружение и перезагрузка моего разбитого .NET-приложения
ответ
Другое решение (на основе 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);
}
}
Единственное возможное обновление - сделать «сторожевой таймер» службой Windows. –
лучше добавить некоторый код временной метки и обнаружить, что приложение разбилось при запуске – Sean
Возможное решение создать еще один процесс для контроля приложения и перезапустите его, если он завершается:
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);
}
}
Одна из проблем, с этого решения заключается в том, что он будет держать процесс перезагрузки навсегда, пока это приложение мониторинга прекращается.
- запустить работу внутри AppDomain; используйте основной AppDomain для его контроля (не защищает от процесса kill, хотя)
- много обработки исключений! т.е. не позволяйте фатальная ошибка срывать процесс
- запустить его в чем-то, что уже имеет рециркуляцию встроенный в - IIS, например
Спасибо Marc. Не могли бы вы добавить пример того, как реализовать решение на базе AppDomain, которое вы предлагаете? –
Предполагая, что это приложение Windows Forms или консольное приложение, вы можете использовать Application.Restart - см. Мой ответ для деталей. – RoadWarrior
Если это приложение Windows Forms:
- Set jitDebugging = true в App.Config. Это предотвращает запуск обработчика обработанных обработчиков встроенных форм Windows Forms.
Теперь независимо от того, является ли это Windows, приложение или консольного приложения Forms:
Регистрация для Application.ThreadException события, например, в C#:
Application.ThreadException + = новое Threading.ThreadExceptionHandler (CatchFatalException);
На данный момент ваше приложение уже на пути в черную дыру. Что произойдет дальше, зависит от того, или нет, это приложение Windows Forms:
- Если это приложение под управлением Windows Forms, вызовите метод Application.Restart в обработчике событий CatchFatalException.
- В противном случае вам потребуется p/invoke для собственных функций application restart and recovery. Эта ссылка обсуждает Vista, но в моих тестах она отлично работает и на XP.
Спасибо. Возможно ли консольное приложение сделать что-то похожее на «Application.ThreadException + = MyHandler;»? –
Да, консольное приложение может сделать то же самое. – RoadWarrior
Но у него нет доступа к классу Application, не так ли? –
- 1. Обнаружение разбитого сокета
- 2. Обнаружение разбитого потока в VideoMixingRenderer
- 3. Как отлаживать «обнаружение разбитого стека»?
- 4. Обнаружение ctrl + s и перезагрузка браузера
- 5. Обнаружение текущего переднего плана Активность и перезагрузка
- 6. Bash: Обнаружение самого длинного матча разбитого кронштейнами
- 7. Перезагрузка моего Android-сервиса
- 8. Обнаружение системы перезагрузка и запуск приложения
- 9. Обнаружение моего географического положения
- 10. Обнаружение возможностей моего GPU
- 11. Тюнинг моего андроида на маяк и обнаружение
- 12. перезагрузка/перезагрузка и повторный переход css?
- 13. перезагрузка моего спуска при использовании пользовательской директивы
- 14. Исправить обнаружение моего программного обеспечения
- 15. Обнаружение причины сбоя моего приложения
- 16. Распознавание разбитого графического драйвера
- 17. Тестирование разбитого IP
- 18. Вычислить область разбитого многоугольника
- 19. Align с бутстрапе разбитого
- 20. Разбитого Шара() цикл
- 21. Сохранение файлов разбитого рабочего пространства
- 22. Разбитого JQuery Tab Switcher
- 23. jquerymobile слайдер и атрибут разбитого шага
- 24. Быстрый и эффективный способ разбора разбитого HTML?
- 25. Разбитого CMake и НКА под OSX
- 26. Разбитого PHP скрипт - FWRITE и переменные
- 27. Обновление разбитого Android WebView
- 28. элементы рекурсивно разбитого списка
- 29. Разбитого макета с изотопным плагиным
- 30. Перезагрузка/перезагрузка Угловое приложение
Я нашел некоторые решения по этому вопросу (прежде чем я его попросил), поэтому я подумал, что было бы неплохо иметь ответы в SO. Если у вас есть дополнительные ответы, пожалуйста, будьте моим гостем. Или просто проголосовать за лучший ответ, чтобы вести других. Также, пожалуйста, повторите этот вопрос, как вы сочтете нужным. –
Добавлена информация о перезапуске консольного приложения, поскольку это, по-видимому, то, что вы используете. – RoadWarrior