2013-04-29 87 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方法。我猜'關機「應該凍結主線程。你看到不同的行爲?你可以展示你的代碼,並告訴我們更多你想達到什麼目的? – outcoldman 2013-04-29 07:31:28

回答

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 2013-04-29 10:28:23

+0

@EngineerSpock我已經更新了答案。你是對的 – Regfor 2013-04-29 11:56:19

+0

@EngineerSpock Amyway很難找到它爲什麼如此運作,即使反射器沒有幫助。與你的相似http://stackoverflow.com/questions/6601875/application-current-shutdown-1-not-closing-wpf-app – Regfor 2013-04-29 12:24:24

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()殺()終止該進程。

對它使用System.Diagnostics命名空間。這將正常工作爲你

+0

是的,我知道。但是寫一個文件會更好。因爲應用程序關閉後Windows可以阻止打開新的視圖。 – EngineerSpock 2013-04-29 09:40:21

+0

Write File.WriteAllText(@「.. \ log.txt」,「Info」);改爲MessageBox.Show(「test」); – EngineerSpock 2013-04-29 09:43:09

+0

然後,您可以通過使用 Process.GetCurrentProcess()。Kill(); 爲它使用System.Diagnostics名稱空間。這對你很好用 – 2013-04-29 09:51:07