【问题标题】:Application.Exit Event not invoked on system reboot系统重新启动时未调用 Application.Exit 事件
【发布时间】:2020-10-11 19:19:03
【问题描述】:

我有一个 WPF 应用程序,每次应用程序退出时都需要保存其当前状态。目前,我正在处理System.Windows.Application.Exit 事件以保存应用程序的状态。但是,似乎没有调用该事件系统重新启动 - 只是普通关机。这是预期的行为吗?

这就是我的应用程序的样子。

public class MyApp : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        ...
        this.Exit += OnExit;
    }
    private void OnExit(object sender, ExitEventArgs e)
    {
        SaveMyApplicationState();
    }
}

我可以使用哪些事件来收到系统重启的通知,以便保存我的应用程序状态?

【问题讨论】:

  • 这能回答你的问题吗? Catch windows shutdown event in a wpf application
  • 不是直接的,因为我现在可以通过 Application.Exit 处理普通的关机事件,但我会检查它是否能解决我的问题。如果是这样,我将向文档提交 PR 以澄清歧义。

标签: c# .net wpf events


【解决方案1】:

要确定系统何时重新启动或关闭,请使用SessionEnding 事件:

App.xaml

<Application ...
     SessionEnding="App_SessionEnding">
    ...
</Application>

App.xaml.cs

public partial class App : Application
{
    void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
    {
        if (.../*canceling*/)
        {
            e.Cancel = true;
        }
        else
        { 
            // Processing before terminating (save current state)
            // ...               
        }
    }
}

有关详细信息,请参阅文档:Application.SessionEnding Event

注意: Application Shutdown Changes in Windows Vista

【讨论】:

  • 我查看了您附加的文档,但我不明白 SessionEnding 事件与 Application.Exit 有何不同。引用 SessionEnding 的文档:“如果 SessionEnding 未处理或未取消,则调用 Shutdown 并引发 Exit 事件”。
  • @Trympet - 在文档中指出以下内容:If SessionEnding is unhandled, or is handled without being cancelled, Shutdown is called and the Exit event is raised. 文档没有说明操作系统可能没有给应用程序足够的时间来完成在 Exit 事件中执行所有代码。
  • @Trympet - 如果处理了SessionEnding,应用程序仍然拥有所有资源,操作系统将等待应用程序执行。应用程序可以返回FALSE 表示它不应该被关闭。
  • 啊,好吧,有道理。谢谢!
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2017-09-10
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多