Да, я вижу это. И да, это изменение Windows, предыдущие версии диспетчера задач напрямую отправляли окну уведомление WM_CLOSE. Теперь я вижу, что он выдает ту же самую команду, которая выдается, когда вы закрываете окно с помощью кнопки «Закрыть» (WM_SYSCOMMAND, SC_CLOSE). Или нажмите Alt+F4 или воспользуйтесь системным меню. Таким образом, Winforms больше не может определить разницу между диспетчером задач и пользователем, закрывающим окно, и вы получаете CloseReason.UserClosing.
То, что произойдет дальше, ожидаемо, если вы не отреагируете на команду закрытия достаточно быстро, диспетчер задач без промедления убьет вашу программу с помощью TerminateProcess().
Имейте в виду, что попытка сохранить данные, когда пользователь прерывает вашу программу через диспетчер задач, является плохой практикой. Ваш пользователь обычно будет использовать это, если ваша программа работает со сбоями, вы больше не можете доверять данным и рискуете написать мусор. Теперь это усугубляется прерыванием вашего кода сохранения, высокими шансами на частично записанный файл или данными базы данных, которые больше нельзя использовать.
Для этого нет простого обходного пути, вероятность того, что Windows будет исправлена для восстановления старого поведения, очень близка к нулю. очень важно, чтобы вы сохраняли свои данные транзакционным способом, чтобы не уничтожить ценные данные, если код сохранения будет прерван. Используйте File.Replace() для файловых данных, используйте транзакцию dbase для записи dbase.
Несовершенный способ обнаружения этого условия — использование событий Form.Deactivate и Activate. Если вы видели событие Deactivate и срабатывает событие FormClosing, то вполне вероятно, что другая программа завершает вашу работу.
Но обычный способ, которым вы справляетесь с этим, является распространенным: если пользователь завершает программу без сохранения данных, вы отображаете диалоговое окно, в котором спрашивается, сохранять ли данные. Диспетчер задач гарантирует, что дальше этого дело не пойдет.
person
Hans Passant
schedule
07.03.2014