如何同步关闭WPF应用程序?

如何同步关闭WPF应用程序?,wpf,multithreading,application-shutdown,Wpf,Multithreading,Application Shutdown,异步工作。这意味着,当您调用此方法时,不会保护您免受调用Shutdown()之后的代码行的执行 所以问题是如何阻止调用App.Current.Shutdown()的线程 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEve

异步工作。这意味着,当您调用此方法时,不会保护您免受调用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.writell将创建一个新文件并写入“Info”字符串。

我创建了一个简单的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);
        }
    }
}

接近
**强文本**
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.Loaded+=主窗口\u Loaded;
}
已加载无效主窗口(对象发送器、路由目标)
{
}
私有void btnClose_单击_1(对象发送者,路由目标e)
{
Application.Current.Shutdown();
MessageBox.Show(“测试”);
}
私有void App_OnExit(对象发送方,ExitEventArgs e)
{
睡眠(3500);
}
}
}
否则


然后可以使用 Process.GetCurrentProcess().Kill()

为其使用System.Diagnostics命名空间。这对您来说可以正常工作。根据文档,App.Current.Shutdown()无法异步工作:

Application.Current.Dispatcher.BeginInvokeShutdown()
正在异步工作

UPD

我已经测试了你的代码。你是对的。关于
App.Current.Shutdown()
的文档具有误导性。将执行当前方法中App.Current.Shutdown()之后的代码。因此,
App.Current.Shutdown
应该是返回之前的最后一条语句(同时也是关于方法调用树的)


作为调用
Environment.Exit(0)
的替代方法,但它可以被视为欺骗和攻击,因为事实上,它可以优雅地终止进程,也可以不优雅地终止进程,而优雅地终止进程是不可能的。

Shutdown
方法应该始终从主线程调用。我猜
Shutdown
应该冻结主线程。你看到了不同的行为吗?你能展示你的代码并告诉我们更多你想要达到的目标吗?是的,我知道。但最好是写一些东西到文件中。因为在应用程序关闭后,Windows会阻止打开新视图;而是MessageBox.Show(“测试”);然后可以使用process.GetCurrentProcess().kill()终止进程;为其使用System.Diagnostics命名空间。这对你来说很好,看起来像是一个肮脏的黑客。终止应用程序可能会阻止退出事件处理程序代码的执行。我已编辑了我的问题。试着写一个文件,让自己相信App.Shutdown的工作原理非常奇怪。@EngineerSpock Amyway很难找到为什么它会这样工作,即使是Reflector也帮不上忙。和你的差不多