C # .Net exe не закрывается при перезапуске ПК, не позволяя компьютеру перезапускаться

StackOverflow https://stackoverflow.com/questions/168317

Вопрос

У нас есть SmartClient, встроенный в C #, который упрямо остается открытым при перезапуске компьютера, на котором он запущен.Это останавливает процесс перезапуска, если пользователь сначала не закроет SmartClient или не будет произведено какое-либо другое ручное вмешательство.

Это вызывает проблемы, когда команда инфраструктуры удаленно устанавливает новое программное обеспечение, требующее перезагрузки компьютера.

Есть идеи, как заставить приложение SmartClient распознавать событие выключения / перезапуска из Windows и изящно завершать работу?

Обновить: Это многопоточное приложение с несколькими потоками графического интерфейса.да, несколько потоков графического интерфейса.Это действительно объединение многих проектов, которые сами по себе могли бы быть автономными приложениями - все они запускаются и управляются из одного exe-файла, который централизует эти методы управления и отслеживает эти потоки.Я не верю, что использование фоновых потоков - это вариант.

Это было полезно?

Решение

Хорошо, если у вас есть доступ к приложению, вы можете обработать событие SessionEnded.

...
Microsoft.Win32.SystemEvents.SessionEnded +=new
  Microsoft.Win32.SessionEndedEventHandler(shutdownHandler);

...

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
  // Do stuff
}

Другие советы

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

Поток - это либо фоновый поток, либо поток переднего плана.Фоновые потоки идентичны потокам переднего плана, за исключением того, что фоновые потоки не препятствуют завершению процесса.Как только все потоки переднего плана, принадлежащие процессу, завершаются, среда выполнения common language завершает процесс.Все оставшиеся фоновые потоки остановлены и не завершаются.

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

Когда пользователь выходит из системы или завершает работу Windows, WM_QUERYENDSESSION сообщение отправляется во все окна верхнего уровня.Видишь Документация MSDN здесь.

Поведение приложения WinForm по умолчанию в ответ на это сообщение заключается в запуске FormClosing событие с CloseReason == WindowsShutDown или другие.Однако обработчик событий может проявить упрямство и отказаться закрывать приложение, тем самым поддерживая систему в рабочем состоянии.

Проверить FormClosing обработчики ваших приложений.Может быть, там что-то есть.Я видел подобные вещи пару раз.

Или, может быть.Приложение Net намеренно игнорирует сообщения "закрыть" или "выйти"?

Фоновые потоки были быстрым и грязным решением, лучшее решение - использовать объекты синхронизации (ManualResetEvent, Mutex или что-то еще), чтобы остановить другие потоки;

Или же следите за всеми вашими открытыми окнами и отправленными WM_CLOSE сообщение при закрытии основного приложения.

Вы должны предоставить больше информации о том, как вы запускаете эти приложения с графическим интерфейсом.может быть, вы запускаете один поток для каждого приложения и вызываете Application.Run(new Form1()); ?

Вы также можете рассмотреть возможность создания AppDomain для каждого приложения с графическим интерфейсом

Обычно a .Сетевое приложение реагировало бы правильно - по крайней мере, это поведение "из коробки".Если это не так, то может произойти целый ряд событий.Мое лучшее предположение, не зная ничего больше о вашей программе, заключается в том, что у вас есть длительный процесс, происходящий в главном потоке пользовательского интерфейса, который мешает приложению отвечать на сообщения окна.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top