Делает Приложение. Событие ApplicationExit работает, чтобы быть уведомленным относительно выхода в non-Winforms приложениях?

Вероятно, лучший подход должен использовать библиотека PDF.JS. Это - чистое HTML5 / рендерер JavaScript для документов в формате PDF без любых сторонних плагинов.

демонстрация Онлайн: http://mozilla.github.com/pdf.js/web/viewer.html

GitHub: https://github.com/mozilla/pdf.js

5
задан Rob Parker 10 February 2009 в 15:48
поделиться

1 ответ

Наконец-то мы узнали об этом больше (но к тому времени моя машина была перестроена и потеряла файлы cookie в моем незарегистрированном профиле; надеюсь, это позволит встретить этот ответ).

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

System.Windows.Forms.Application.ThreadExit - срабатывает при выходе из цикла обработки сообщений. System.Windows.Forms.Application.ApplicationExit - срабатывает при выходе из всех циклов сообщений System.AppDomain.CurrentDomain.DomainUnload - срабатывает при выходе из домена, отличного от домена по умолчанию System.AppDomain.CurrentDomain.ProcessExit - срабатывает при выходе из домена приложения по умолчанию System.AppDomain.CurrentDomain.UnhandledException - срабатывает, когда возникает неперехваченное исключение, завершающее приложение.

Возможно только одно из событий DomainUnload или ProcessExit для данного домена приложения, в зависимости от того, является ли он доменом по умолчанию (верхнего уровня) для процесса или был создан как поддомен (например, на веб-сервере). Если приложение не знает, что это может быть (как в нашем случае), ему необходимо подписаться на оба, если оно хочет поймать фактическую выгрузку для себя. Кроме того, похоже, что UnhandledException (которое в .NET2.0 всегда фатально) может предотвратить два других события, так что это может быть третьим случаем для обработки. Эти три события должны работать для любого приложения .NET.

Есть предостережение, что время выполнения для ProcessExit ограничено (около 4 секунд?), Поэтому может оказаться невозможным выполнить обширную «финальную» работу в этом обработчике событий. Это должно быть что-то, что можно сделать быстро.

События Приложение применимы только к приложениям WinForms (однако мы подозреваем, что они не могут применяться в приложениях, чистых WPF). Названия могут вводить в заблуждение, потому что они названы в соответствии с их самым основным нормальным использованием, которое имеет определенные допущения. ThreadExit относится не к фактическому System.Threading.Thread , а скорее к циклу сообщений ( Application.Run () )) потока пользовательского интерфейса, и ApplicationExit аналогичным образом относится к сбору форм приложения в одном или нескольких потоках пользовательского интерфейса. Как обычно, как только вызов Application.Run () возвращается, вызванный из метода входа потока, метод входа быстро завершается, а затем сам поток завершается. И как только все потоки пользовательского интерфейса завершены, приложение WinForms обычно готово и завершает работу.

Еще одно важное событие - это событие System.Windows.Forms.Application.ThreadException . Цикл сообщений Windows может быть настроен на перехват исключений, возникающих при обработке сообщения, и отправку этого события, вместо того, чтобы позволить им быть неперехваченными (и, следовательно, фатальными) исключениями. Перехват этих исключений позволяет циклу сообщений (и этому потоку пользовательского интерфейса) продолжать работу (после прерывания текущего обработчика сообщений). В любой момент времени для данного потока может быть только один подписчик на это событие (подписки перезаписывают любого предыдущего подписчика), и он должен быть настроен перед созданием любой формы и подпиской перед входом в цикл сообщений. См. Справку MSDN для этого события и System.Windows.Forms.Applicaton.SetUnhandledExceptionMode () для получения дополнительных сведений.

10
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: