扩展执行会话允许应用向系统请求在特定场景下保持运行,即使在电池供电的设备上,应用原本也可能因资源缩减而被限制运行。 虽然桌面应用不会自动挂起,但扩展执行仍可用于向系统发出意向信号。
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,即使在桌面应用中也是如此。 - 工作完成后立即释放会话。
- 不要长时间保持扩展会话,否则可能会影响设备电池续航。