4

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」文字列を書き込みます。

4

2 に答える 2

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、return の前の最後のステートメントにする必要があります (メソッド コール ツリーも考慮します)。

call の代わりにEnvironment.Exit(0)、トリック アンド ハックと見なすことができます。実際には、プロセスを正常に終了するかどうかに関係なく、正常に終了できない場合に終了するためです。

于 2013-04-29T09:20:04.293 に答える
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 名前空間を使用します。これはあなたのためにうまくいくでしょう

于 2013-04-29T09:06:57.303 に答える