Как синхронно завершить работу приложения WPF?

App.Current.Shutdown() работает асинхронно. Это означает, что когда вы вызываете этот метод, вы не защищены от выполнения строк кода, которые следуют за вызовом Shutdown().

Так что вопрос в том, как заблокировать поток, из которого вызывается App.Current.Shutdown()?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        App.Current.Shutdown();

        File.WriteAllText(@"..\log.txt", "Info");    
    }
}

 private void App_OnExit(object sender, ExitEventArgs e) {
        Thread.Sleep(3500);
    }

File.WriteAll создаст новый файл и запишет в него строку "Info".

2 ответа

Решение

App.Current.Shutdown() не работает асинхронно в соответствии с документацией: http://msdn.microsoft.com/en-us/library/ms597013.aspx

Application.Current.Dispatcher.BeginInvokeShutdown() работает асинхронно.

UPD

Я проверил ваш код. Вы правы. И документация о App.Current.Shutdown() вводит в заблуждение. Код после App.Current.Shutdown() в текущем методе будет выполнен. Следовательно App.Current.Shutdown должен быть последним оператором перед возвратом (а также с учетом дерева вызовов метода).

Как альтернатива звонить Environment.Exit(0) но это можно рассматривать как трюк и хак, потому что на самом деле он завершает процесс либо изящно, либо нет, когда изящно это невозможно.

Я создал простое приложение WPF и скопировал ваш код. Выключение не работает асинхронно в нем. Приложение было закрыто сразу после нажатия кнопки закрытия.

 <Grid>
    <Button x:Name="btnClose" Height="50" Width="100"  Click="btnClose_Click_1"  Margin="265,135,152,135">Close</Button>
</Grid>**strong text**

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void btnClose_Click_1(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();

            MessageBox.Show("test");
        }

        private void App_OnExit(object sender, ExitEventArgs e)
        {
            Thread.Sleep(3500);
        }
    }
}

еще

Затем вы можете убить процесс с помощью Process.GetCurrentProcess().Kill();

используйте для этого пространство имен System.Diagnostics. Это будет хорошо работать для вас

Другие вопросы по тегам