如何防止我的 WPF 应用在处理由于系统关闭而引发的 Application.Exit 事件时终止?



我们有一个应用程序,需要在关机时保存设置,包括Windows关机时。在这种情况下,我们成功接收了Application.Exit事件,但随后,根据时间,应用程序被简单地终止。这并不是说我们所做的不仅仅是保存两个带有设置的小XML文件。有时他们得救,有时不得救,同样这一切都取决于时间。

在收到 Windows 正在关闭的信号后,应用程序清理是否有一些最长时间?

以下解决方法"有效",但我不明白为什么:

// In our main application class derived from Application:
protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
{
e.Cancel = true;
this.Shutdown();
base.OnSessionEnding(e);
}

这似乎工作正常,并允许应用程序以与通常相同的方式退出(它是一种最小化到托盘类型的应用程序,使用ShutdownMode.OnExplicitShutdown当退出托盘图标时,我们确实显式调用 Application.Shutdown(。

那么,为什么窗口不允许应用程序有时间处理 Exit 事件呢?是什么导致它强制终止应用程序而似乎没有等待时间?是因为我们没有打开的窗口(当它最小化到托盘但不关闭它时,我们隐藏了我们的主窗口(?

解决方法呢?这是不好的做法,还是不好的做法?

当您关闭计算机时,您可能已经注意到弹出一个窗口,告诉您应用程序 xyz 仍在运行,是否要关闭它。

这些机制内置于窗口中,旨在处理应用程序正在运行且用户可能希望在关闭之前保存工作的场景。

应用程序会话结束旨在用于此类事情。 文档进行了一些详细说明:https://learn.microsoft.com/en-us/dotnet/api/system.windows.application.sessionending?redirectedfrom=MSDN&view=netframework-4.8

默认情况下,应用程序在 Windows 会话结束时关闭,这在用户注销或关闭时发生。发生这种情况时,Windows 会要求关闭每个打开的应用程序。但是,发生这种情况时,应用程序可能尚未准备好关闭。例如,应用程序可能具有处于不一致状态或处于长时间运行操作中的数据。在这些情况下,可能需要阻止会话结束,并且可能更可取的是允许用户选择是否让会话结束。

因此,会话结束专为你的方案而设计。

应用程序退出不是。

该事件将在关闭应用的过程中触发,并且不会中断该过程。正是出于这个原因,放置您依赖的任何代码来保存设置都是一个糟糕的地方。

最新更新