2011-12-15 3 views
5

Вот фрагмент кода, где я вывожу простой диалог («chooser»). В зависимости от ввода пользователя приложение может завершиться.Почему моя программа C# WPF продолжает выполнять строки после Application.Shutdown()?

DPChooser chooser = new DPChooser(dataProvider); 
    if (chooser.ShowDialog() == false) 
     Application.Current.Shutdown(0); 
    else 
     ApplicationContext.Current.InitializeDataProviderAPI(chooser.DataProvider); 
    } 

    // more code continues here 
    // THE PROBLEM: 
    //  Even when Shutdown() above is called, 
    //  the execution continues proceeding past here! 

Я запустить его в отладчике, так что я знаю что если оценивает ложь, и я знаю что Shutdown() вызывается.

Так почему же он не закрыт?

Примечание: это не резьбонарез, я думаю. Я еще ничего не начинаю на других потоках. Даже если речь шла о потоке, я все равно не ожидал, что код в этом потоке продолжит работу над Shutdown().

ответ

10

Shutdown останавливает обработку Диспетчера и закрывает приложение до WPF, но фактически не убивает текущий поток.

В вашем случае вам необходимо предотвратить выполнение кода, выходящего за этот вызов. Достаточно простого возврата:

if (chooser.ShowDialog() == false) 
{ 
    Application.Current.Shutdown(0); 
    return; 
} 
else { //... 
+0

Хех, это не так интуитивно. Я должен был подумать, что просто вернусь туда, хотя, на меня. Благодарю. –

+0

Подождите, документы для Shutdown (int exitCode) говорят, что exitCode возвращается в операционную систему. Если этот метод фактически не убивает приложение, как приложение может использовать его для возврата этого кода exitCode? –

+0

@GrantB Это контролируемое выключение, которое не останавливает исполняемый поток. Если вы используете стандартную WPF-сантехнику, то этот код выхода - это то, что возвращается из точки входа, но это происходит после того, как все остальное выполняется (как вы обнаружили здесь). –

2

Это не завершает процесс немедленно, его контролируемое завершение работы.

, если вы хотите (не рекомендуется), чтобы убить мгновенно

Process.GetCurrentProcess().Kill(); 
+0

Environment.Exit() также работает, но я знал, что это одинаково не желательно. –

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