如何禁用UWP应用程序的挂起?

7

我正在使用C#开发一款只能在桌面电脑上运行的Windows 10 UWP应用程序,目标平台版本为10.0.14393.0。由于业务需求,应用程序的生命周期必须像传统的Win32应用程序一样运作。

因此,我遵循了这篇文章中的建议,请求使用ExtendedExecutionReason.Unspecified来创建一个ExtendedExecutionSession。我还配置了Windows永不休眠和永不休眠。

尽管如此,在极少数情况下,Windows会出于SystemPolicy原因吊销扩展执行会话,然后暂停UWP应用程序。

有两个问题:

  1. 如何获取更多信息(系统日志?事件日志?)以了解是什么导致了Windows吊销扩展执行会话?
  2. 如何消除这些罕见的暂停情况,使UWP应用程序的生命周期与Win32应用程序完全相同(即保持运行直到用户明确停止运行)?

谢谢!


你测试应用程序的电脑是否有电池或连接到不间断电源? - A. Milto
这台电脑没有电池,插入到墙上的交流电源插座中。 - hwaien
5个回答

7
使用 ExtendedExecutionSessionExtendedExecutionReason.Unspecified 会受到多个关于资源消耗的限制。由于您的测试设备没有电池,因此您的应用程序被暂停的最可能原因是其高内存使用率。您可以尝试在内存消耗方面优化应用程序,并根据文档使用 内存管理 API,但这仍然不能保证您的应用程序永远不会被暂停。
如果您的应用程序面向商业领域,那么您可以考虑使用更强大的 ExtendedExecutionForegroundSession 来代替 ExtendedExecutionSession。这可能是您问题的完美解决方案。但这是一种受限制的功能,这意味着使用它的应用程序不允许进入 Windows Store - 只允许进入 Windows 商店。您还需要在清单中手动声明 extendedExecutionUnconstrained 功能(请参阅文档的 特殊和受限制的功能部分)以利用 API。
或者,您可以使用防止应用程序长时间暂停的黑客方法:
  1. 使用 应用服务 与 Win32 应用程序通信,正如pnp0a03所建议的那样。

  2. 使用 后台媒体播放 在后台无限循环播放静音音频样本(即使用户手动停止它或其他应用程序暂停它以播放自己的后台音频,您的应用程序也可以跟踪并自动重新启动播放)。


4
我试了几天,但最终在这个链接中找到了很好的解释和解决方案,最重要的是易于理解。 您需要将代码放入app.xaml.cs文件中,并编辑包清单文件。 您还需要在app.xaml.cs中添加以下指令: using Windows.ApplicationModel.ExtendedExecution.Foreground; using System.Threading.Tasks; 非挂起式UWP

2

我记得之前的SO帖子 - 他的问题是:当我使用应用程序服务与Win32应用程序通信时,它会阻止应用程序进入挂起状态。我已经成功地使用该帖子中提到的示例应用程序重新创建了该问题。

我不知道这是否是预期行为,但它可能有助于解决您的情况。

UWP应用程序未进入挂起状态


1
根据MSDN杂志中的这篇文章,您还可以使用后台任务来保持应用程序的活动状态。该文章声称应优先使用后台任务而不是Extended Session方法。 后台任务实现
public sealed class TimerTask : IBackgroundTask
{
  public void Run(IBackgroundTaskInstance taskInstance)
  {
    var deferral = taskInstance.GetDeferral();
    taskInstance.Canceled += TaskInstance_Canceled;
    await ShowToastAsync("Hello from Background Task");
    deferral.Complete();
  }
  private void TaskInstance_Canceled(IBackgroundTaskInstance sender,
    BackgroundTaskCancellationReason reason)
  {
    // Handle cancellation
    deferral.Complete();
  }
}

在应用程序清单中,还必须注册后台任务。此注册会告诉Windows触发器类型、入口点和任务的可执行主机,如下所示:
<Extensions>
  <Extension Category="windows.backgroundTasks" EntryPoint="BackgroundTasks.TimerTask">
    <BackgroundTasks>
      <Task Type="timer" />
    </BackgroundTasks>
  </Extension>

后台任务注册
private void RegisterBackgroundTasks()
{
  BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
  builder.Name = "Background Test Class";
  builder.TaskEntryPoint = "BackgroundTaskLibrary.TestClass";
  IBackgroundTrigger trigger = new TimeTrigger(30, true);
  builder.SetTrigger(trigger);
  IBackgroundCondition condition =
    new SystemCondition(SystemConditionType.InternetAvailable);
  builder.AddCondition(condition);
  IBackgroundTaskRegistration task = builder.Register();
  task.Progress += new BackgroundTaskProgressEventHandler(task_Progress);
  task.Completed += new BackgroundTaskCompletedEventHandler(task_Completed);
}

0

使用Visual Studio调试模式运行应用程序,应用程序永远不会进入挂起状态。它由Visual Studio保持唤醒。

啊,这只是一个玩笑。

我认为不幸的是,您期望的行为与UWP的设计原则相矛盾。

系统有权在一定时间后将后台应用程序暂停。如果您请求扩展执行会话,则还必须准备好撤销,连接到电源墙也不能使应用程序永远运行。

选项1是采用桌面应用程序,但这可能不是一个选择。如果您因为用户喜欢UWP而不喜欢“挂起”的想法而获得此要求(挂起个啥呀?),恐怕您无法满足此要求。

选项2是...是否有任何真正的任务需要保持运行,即使应用程序被切换到后台?如果任务需要周期性运行,例如检查电子邮件帐户的收件箱,则可以使用某种定时器触发的后台任务。

选项3:考虑展示器模式,在设备上只允许运行一个应用程序,因此不可能将其切换到后台并进行暂停。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接