WinRT/UWP 是停电挂起吗?

WinRT/UWP is suspending rising on power off?

我正在尝试使用应用程序暂停事件在应用程序 (WinRT 8.1) close/sleep/minimze(或 windows shutdown/restart 在具有 WIN10 的平板电脑中)之前保存数据。

https://docs.microsoft.com/en-us/windows/uwp/launch-resume/suspend-an-app

但是os关机/关机不工作WinRT/UWP: 长按关机键是否有挂起动作?

Is suspending action rising on long power off button holding?

长按关机键系统会强制关机。并且系统无法确定 Current user session 是否已完成。因此无法正确调用挂起事件处理程序。

来自Windows 10 universal Windows platform (UWP) app lifecycle

Current user session is based on Windows logon. As long as the current user hasn't logged off, shut down, or restarted Windows, the current user session persists across events such as lock screen authentication, switch-user, and so on.

因此,在关闭之前,该应用程序仍处于 Current user sessionSuspended 将在关机时调用。

请注意,您无法在 Visual Studio 内的调试模型中对其进行测试。因为当你关闭系统时,Visual Studio首先会退出调试模式。 Suspended 事件不会按预期调用。您可以使用以下代码进行验证。

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var stringBulider = new StringBuilder();
    var deferral = e.SuspendingOperation.GetDeferral();

    Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
    Object value = localSettings.Values["exampleSetting"];
    stringBulider.Append(value.ToString() + "/Next");
    localSettings.Values["exampleSetting"] = stringBulider.ToString();

    deferral.Complete();
}

每次关闭时,stringBulider 将一次追加一个。

Suspending 生命周期事件将在 OS 正常关闭的情况下触发 - 如果您这样做 Start -> Shut down

不幸的是,长按关机按钮和按下重启按钮并不是这种情况,因为这两种方式都是不正确的关机方式。长按电源键关机本质上是突然 "cuts-down power" 到 PC,这意味着 OS 无法响应,所有未保存的数据都将丢失。这种关闭 PC 的方法应该只在发生非常糟糕的事情并且一切都死机时才使用。这就是为什么在这种情况下 UWP 应用程序没有机会 运行 挂起事件处理程序。