Предотвращение необработанных исключений для остановки приложения - PullRequest
1 голос
/ 21 сентября 2011

У меня есть вопрос об обработке исключений.

Чтобы не допустить диалогового окна Windows «[Ваша программа перестала работать» », я обычно перехватываю даже необработанные исключения следующим образом:

В App.xaml.cs: ​​

    protected override void OnStartup(StartupEventArgs e)
    {
        Application.Current.DispatcherUnhandledException += ProcessDispatcherException;
        AppDomain.CurrentDomain.UnhandledException += ProcessUnhandledException;
        // Blah blah blah... Performs a lot of loading operations...
        mainWindow.Show();
    }

, а затем

    private void ProcessUnhandledException(object o, UnhandledExceptionEventArgs e)
    {
        logException("An unhandled exception has been thrown\n"+(e.ExceptionObject as Exception).ToString(), e.ExceptionObject as Exception);
        Application.Current.Shutdown();
    }

Хорошо, у меня нет диалогового окна Windows.Теперь в идеале я хотел бы предотвратить этот сценарий закрытия сил.Приложение, которое я разрабатываю здесь, имеет время запуска, которое длится около 1 минуты для самых легких пользователей (большинству из них нужно подождать 2 или 3 минуты для его запуска, оно должно загружать очень большие и сложные ссылочные данные), поэтому перезапускэто может вызвать проблемы

Я хотел бы узнать о ваших «лучших методах» для этого случая.Я думаю о том, чтобы просто заново создать новое окно в обработчике и снова показать его, так что только пользовательский интерфейс будет переинициализирован в состояние запуска, никакие другие ссылки не будут загружены, сохранено 2-3 минуты.Любые другие советы?

Да, и, конечно, это «чрезвычайный случай, который не должен быть достигнут», но, к сожалению, это происходит, главным образом, из-за наших зависимостей от других систем, управляемых другими филиалами компании сна кого я не имею никакого контроля или права жаловаться (да, международные компании могут когда-нибудь сосать), и это не может быть отловлено в коде: (

Спасибо!

1 Ответ

3 голосов
/ 21 сентября 2011

Из того, что вы пишете, я предполагаю, что вы хотите, чтобы ваше приложение было критически важным, то есть, если что-то происходит, что приводит к его отказу, его необходимо перезапустить автоматически.

Лучший способ сделать этоэто создать второй сторожевой процесс, который будет перезапускать ваше приложение в случае его сбоя.После этого вы можете позволить своему приложению тихо завершать работу в случае возникновения необработанного исключения и очищать все, что можете в вашем обработчике необработанного исключения.

Самый простой способ реализовать сторожевой таймер, подобный этому, состоит в отсутствии окна.процесс (например, консольное приложение) с фоновым циклом потока, который периодически проверяет, запущено ли ваше приложение, проверяя, заблокирован ли дескриптор ожидания.Примерно так:

// 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.

Если пользователь закрывает приложение и вы не хотите, чтобы оно снова запускалось, вы можете отправить сигнал процессу сторожевого таймера (например, с помощьюименованные каналы или используйте второй тип дескриптора ожидания, который вы блокируете, когда хотите, чтобы сторожевой таймер приостановил или завершил работу), если приложение было закрыто и не должно перезапускаться.

Вы можете запустить свой сторожевой таймер впапку автозагрузки или другой автоматический метод, или вы можете запустить приложение при первом запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...