gpt4 book ai didi

c# - 了解 Windows Universal App (UWP) 中的扩展执行 session

转载 作者:可可西里 更新时间:2023-11-01 09:47:28 30 4
gpt4 key购买 nike

我正在努力让扩展执行 session 为我的 Windows 通用应用程序工作。

我想要实现的是以下场景。用户想通过蓝牙将手机与设备连接。目前,每当屏幕关闭或来电或用户最小化应用程序时,连接都会失败,我们会在恢复时重新启动它。我想为这个正在进行的连接启用扩展执行,这样应用即使在最小化(暂停)时也能继续工作。

我认为我需要 ExtendedExecutionReason.Unspecified,因为它应该允许我的应用程序在挂起状态下运行最多 10 分钟(这对我的目的来说绰绰有余)。但是,连接似乎总是在挂起时失败(当我尝试使用 VS 的“应用程序生命周期”下拉列表从调试器更改我的应用程序状态时,我被 ExtendedExecutionRevokedReason.SystemPolicy 撤销了)。我已经为我的应用启用了所有电池和后台权限,但仍然没有用。

我的代码大致如下:

        ... (on begin connection)
ClearExtendedExcecution();

DisplayRequest dr = new DisplayRequest();
var newSession = new ExtendedExecutionSession
{
Reason = ExtendedExecutionReason.Unspecified,
Description = "Pair device"
};
newSession.Revoked += SessionRevoked;
ExtendedExecutionResult result = await newSession.RequestExtensionAsync();

dr.RequestActive();
try
{
switch (result)
{
case ExtendedExecutionResult.Allowed:
m_extendedExecutionSession = newSession;
// DO WORK HERE
await ConnectDeviceAsync(token);
break;
default:
case ExtendedExecutionResult.Denied:
// fallback to request screen active if extended execution fails, but still do work
newSession.Dispose();
await ConnectDeviceAsync(token);
break;
}
}
finally
{
dr.RequestRelease();
ClearExtendedExcecution();
}
...


private async void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args)
{
await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
switch (args.Reason)
{
case ExtendedExecutionRevokedReason.Resumed:
Logger.Debug("Extended execution revoked due to returning to foreground.");
break;

case ExtendedExecutionRevokedReason.SystemPolicy:
Logger.Debug("Extended execution revoked due to system policy.");
break;
}
});
}

private void ClearExtendedExcecution()
{
if (m_extendedExecutionSession == null)
{
return;
}

m_extendedExecutionSession.Revoked -= SessionRevoked;
m_extendedExecutionSession.Dispose();
m_extendedExecutionSession = null;
}

任何关于我做错了什么的提示,扩展执行 session 的确切使用方式或如何调试应用程序的生命周期(不撤销系统策略)将不胜感激。谢谢!

最佳答案

在这种情况下,VS 中的“Suspend”生命周期事件模拟了由于资源不足而导致的暂停,因此这就是为什么你得到“SystemPolicy”的原因。

如果您在没有附加调试器的情况下运行您的应用程序,您将它最小化(桌面)或切换到另一个应用程序(手机),执行将继续,但是(!)当您恢复您的应用程序时, session 将因“已恢复”原因而被撤销并且您必须通过调用 RequestExtensionAsync() 方法再次启动您的 session 。

此技术可确保您的执行在您需要时一直处于事件状态。

关于c# - 了解 Windows Universal App (UWP) 中的扩展执行 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37411668/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com