Из того, что вы пишете, я предполагаю, что вы хотите, чтобы ваше приложение было критически важным, то есть, если что-то происходит, что приводит к его отказу, его необходимо перезапустить автоматически.
Лучший способ сделать этоэто создать второй сторожевой процесс, который будет перезапускать ваше приложение в случае его сбоя.После этого вы можете позволить своему приложению тихо завершать работу в случае возникновения необработанного исключения и очищать все, что можете в вашем обработчике необработанного исключения.
Самый простой способ реализовать сторожевой таймер, подобный этому, состоит в отсутствии окна.процесс (например, консольное приложение) с фоновым циклом потока, который периодически проверяет, запущено ли ваше приложение, проверяя, заблокирован ли дескриптор ожидания.Примерно так:
// Declared in class
object checkLocker = new object();
bool mtStopCheck = false;
// Thread loop
bool stopCheck = false;
while (stopCheck == false)
{
if (wait_handle_is_unlocked)
restart_application();
Thread.Sleep(1000);
lock (checkLocker)
{
stopCheck = mtStopCheck;
}
}
Когда вы хотите выключить сторожевой таймер, другой поток делает это:
// Stop the watchdog thread so the watchdog app can shut down
lock (checkLocker)
{
mtStopCheck = true;
}
Поскольку вы будете работать в том же терминальном сеансе, вы этого не делаетенужен глобальный дескриптор ожидания, чтобы не было проблем с привилегиями в Vista / Windows 7.
Если пользователь закрывает приложение и вы не хотите, чтобы оно снова запускалось, вы можете отправить сигнал процессу сторожевого таймера (например, с помощьюименованные каналы или используйте второй тип дескриптора ожидания, который вы блокируете, когда хотите, чтобы сторожевой таймер приостановил или завершил работу), если приложение было закрыто и не должно перезапускаться.
Вы можете запустить свой сторожевой таймер впапку автозагрузки или другой автоматический метод, или вы можете запустить приложение при первом запуске.