在Windows 应用 SDK桌面应用中使用扩展执行

扩展执行会话允许应用向系统请求在特定场景下保持运行,即使在电池供电的设备上,应用原本也可能因资源缩减而被限制运行。 虽然桌面应用不会自动挂起,但扩展执行仍可用于向系统发出意向信号。

Important

无论桌面应用是否使用扩展执行,桌面应用都继续运行。 桌面应用中的主要好处 ExtendedExecutionSession 是与系统通信,表明你的工作非常重要,不应被节能措施(如新式待机或节电器)中断。

何时使用扩展执行

扩展执行会话在桌面应用中最有用,适用于:

  • 保存关键数据 - 确保在设备进入备用状态之前完成大型保存操作。
  • 位置跟踪 - 在笔记本电脑上最小化应用时保持 GPS 数据流。
  • 长时间运行的计算 - 完成呈现、编译或数据分析任务。

对于桌面应用只需继续运行(例如聊天应用或音乐播放器)的方案,无需扩展执行 , 应用将继续正常运行。

创建扩展执行会话

使用 ExtendedExecutionSession 类:

using Windows.ApplicationModel.ExtendedExecution;

private ExtendedExecutionSession? _session;

private async Task StartExtendedSessionAsync()
{
    var session = new ExtendedExecutionSession
    {
        Reason = ExtendedExecutionReason.Unspecified,
        Description = "Completing critical data save"
    };

    session.Revoked += ExtendedSession_Revoked;

    ExtendedExecutionResult result = await session.RequestExtensionAsync();

    if (result == ExtendedExecutionResult.Allowed)
    {
        _session = session;
        // Proceed with the long-running work
    }
    else
    {
        session.Dispose();
        // The system denied the request — handle gracefully
    }
}

private void ExtendedSession_Revoked(object sender,
    ExtendedExecutionRevokedEventArgs args)
{
    // The session was revoked. Save state quickly.
    if (args.Reason == ExtendedExecutionRevokedReason.SystemPolicy)
    {
        // System needs resources — wrap up immediately
    }
}

延长执行的原因

原因 用例
SavingData 应用需要完成保存操作
LocationTracking 你的应用正在跟踪用户的位置
Unspecified 其他长时间运行的工作

注释

LocationTracking 需要在应用清单中声明 location 功能并获得用户同意。

结束会话

完成工作后,释放会话以释放请求:

private ExtendedExecutionSession? _session;

private void ExtendedSession_Revoked(object sender,
    ExtendedExecutionRevokedEventArgs args)
{
}

private void StopExtendedSession()
{
    if (_session != null)
    {
        _session.Revoked -= ExtendedSession_Revoked;
        _session.Dispose();
        _session = null;
    }
}

与 UWP 的区别

Behavior UWP 桌面
Purpose 防止挂起 信号对于电源管理的重要性
没有它,应用仍会持续运行 否 — UWP 应用会被挂起 是 — 桌面应用正常运行
会话撤销 可能导致被暂停 不会停止该应用,但可能会启用省电措施
SavingData 原因 防止在保存期间挂起 相同的 API,没那么关键,因为应用不会被挂起

最佳做法

  • 仅当你有不应被节能机制中断的特定任务时,才请求延长执行时间。
  • 始终处理事件 Revoked ,即使在桌面应用中也是如此。
  • 工作完成后立即释放会话。
  • 不要长时间保持扩展会话,否则可能会影响设备电池续航。