2013-04-29 3 views
4

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

Итак, вопрос заключается в том, как заблокировать поток, из которого вызывается 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 создаст новый файл и напишет в него строку «Информация».

+1

Метод 'Shutdown' должен всегда вызываться из главной темы. И я думаю, 'Shutdown' должен заморозить основной поток. Вы видите другое поведение? Не могли бы вы показать свой код и рассказать нам больше, чего вы пытаетесь достичь? – outcoldman

ответ

4

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), но это можно рассматривать как трюк и взломать, поскольку в том, что он прекращает процесс либо изящно, либо нет, когда изящно невозможно.

+1

Я отредактировал свой вопрос. Попробуйте написать в файл и убедите себя, что App.Shutdown работает очень странно. – EngineerSpock

+0

@EngineerSpock Я обновил ответ. Вы правы – Regfor

+0

@EngineerSpock Amyway трудно найти, почему он работает так, даже Reflector не помогает. Подобно вашим http://stackoverflow.com/questions/6601875/application-current-shutdown-1-not-closing-wpf-app – Regfor

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 для него. Это будет хорошо работать для вас

+0

Да, я знаю. Но было бы лучше записать в файл что-то. Потому что после закрытия приложения Windows может предотвратить открытие новых просмотров. – EngineerSpock

+0

Write File.WriteAllText (@ ".. \ log.txt", "Информация"); вместо MessageBox.Show ("test"); – EngineerSpock

+0

Затем вы можете убить процесс, используя Process.GetCurrentProcess(). Kill(); Используйте пространство имен System.Diagnostics для него. Это будет хорошо работать для вас –