2015-03-04 4 views
0

При попытке нажать стандартную кнопку выхода Windows 7 во время работы моего приложения WPF, я получаю «Эта программа предотвращает выход Windows из системы». Я хотел бы заставить его закрыть, не нажимая «Force log off».Как избежать приложения WPF не реагировать при выходе из системы

Аналогично, нажатие «Завершить задачу» в диспетчере задач (приложений) вызывает его не реагирование, а не просто закрытие программы.

Я попытался добавить это Window_Closing, но это не похоже, чтобы сделать это:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    Environment.Exit(0); 
} 

Я новичок в WPF, но мне кажется, что окно не закрывается должным образом. Как я могу предотвратить, что «программа не позволяет Windows выйти из системы» при выполнении выхода из системы Windows, или «Программа не отвечает», когда убивает ее из диспетчера задач?

+0

Возможно, вы используете некоторые махинации с потоками переднего плана. – Spo1ler

+0

Не могли бы вы рассказать? Я не уверен, что это значит – Alex

+0

Вы, вероятно, часто выполняете задачи, связанные с вычислениями, в потоке ui вместо рабочего потока, что не позволяет приложениям своевременно отвечать на операционную систему. – Spo1ler

ответ

1

Это должно быть проблемой только в том случае, если ваше приложение не отвечает на события закрытия, отправленные из Windows.

Это обычно происходит, если вы выполняете код в потоке пользовательского интерфейса, что мешает ему отвечать на сообщения. Таким образом, помещение чего-то в заключительные события и подобное не будет иметь никакого эффекта, поскольку они не смогут обрабатываться, пока ваша «работа» не закончится.

Правильный способ справиться с этим - переместить работу на потоки фона. Это позволяет реагировать на приложение, которое позволяет ему отвечать на запрос от Windows до Close.

+0

Думаю, это имеет смысл для меня. В моей программе много работы с базами данных. Я изначально разработал это с winforms, и поскольку мой первый проект WPF скопировал все мои классы в WPF и создал несколько диспетчеров. Итак, из того, что вы написали, правильный способ разработки WPF-приложения состоит в том, чтобы выполнить всю работу в отдельном потоке из пользовательского интерфейса? – Alex

+0

@AlexB Да, хотя это верно и в Windows Forms. Если бы вы сделали это в основном потоке, вы столкнулись бы с той же проблемой. –

+0

Можно ли использовать множество функций базы данных и другие фоновые работы на 4 отдельных диспетчерских таймерах, работающих на потоке пользовательского интерфейса? – Alex

Смежные вопросы