【问题标题】:How to Disable UWP App Suspension?如何禁用 UWP 应用暂停?
【发布时间】:2018-04-30 14:02:55
【问题描述】:

我正在使用 C# 为仅在台式计算机上运行的 Windows 10 开发 UWP 应用,目标平台版本为 10.0.14393.0。由于业务需求,应用生命周期必须像传统的 Win32 应用一样运行。

因此,我按照this article 的建议请求ExtendedExecutionSessionExtendedExecutionReason.Unspecified。我还将 Windows 配置为永不休眠和永不休眠。

不过,在极少数情况下,Windows 会以 SystemPolicy 为由撤销扩展执行会话,然后继续挂起 UWP 应用。

两个问题:

  1. 如何获取有关导致 Windows 撤销扩展执行会话的原因的更多信息(系统日志?事件日志?)?
  2. 如何摆脱这些罕见的暂停情况,以使 UWP 应用生命周期的行为与 Win32 应用完全一样(即保持运行直到用户明确停止运行)?

谢谢!

【问题讨论】:

  • 您测试应用的 PC 是否有电池或连接到不间断电源?
  • 电脑没有电池,插在墙上的交流电源插座上。

标签: c# uwp


【解决方案1】:

ExtendedExecutionSessionExtendedExecutionReason.Unspecified 在资源消耗方面受到多重限制。由于您的测试设备没有电池,因此您的应用程序被暂停的最可能原因是其高内存使用。您可以尝试在内存消耗方面优化应用程序并按照文档建议使用Memory Management APIs,但这仍然不能保证您的应用程序永远不会被挂起。

如果您的应用是针对商业领域的,那么您可以考虑使用更强大的ExtendedExecutionForegroundSession 而不是ExtendedExecutionSession。这可能是您问题的完美解决方案。但这是一项受限制的功能,这意味着使用它的应用程序不允许在 Windows 应用商店中使用 - 只能在适用于企业的 Windows 应用商店中使用。您还需要在清单中手动声明 extendedExecutionUnconstrained 功能(请参阅 Special and restricted capabilities section of documentation)以利用 API。

或者,您可以使用 hack 来防止应用长时间暂停:

  1. 按照 pnp0a03 的建议使用 App services 与 Win32 应用程序进行通信。

  2. 使用 Background Media Playback 在后台无限循环播放无声音频样本(即使用户手动停止它或其他应用暂停它以播放自己的背景音频,您的应用程序可以跟踪它并自动重新开始播放)。

【讨论】:

    【解决方案2】:

    我试图解决这个问题好几天了,但后来找到了这个链接。对此非常好的解释和解决方案,最重要的是..易于理解。 您需要将代码放入 app.xaml.cs 并编辑包清单文件。 您还需要 app.xaml.cs 中的以下指令

    使用 Windows.ApplicationModel.ExtendedExecution.Foreground; 使用 System.Threading.Tasks;

    non-suspending-uwp

    【讨论】:

      【解决方案3】:

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

      我现在不知道这是不是有意的行为,但它可能有助于解决您的情况。

      UWP application not going to suspend state

      【讨论】:

        【解决方案4】:

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

        啊,这只是个玩笑。

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

        系统保留在“延迟”后暂停后台应用程序的权利。如果您请求延长执行会话,您还必须为撤销做准备,连接到墙上电源不会让应用程序永远运行。

        选项 1 是使用桌面应用程序,尽管这可能不是一个选项。如果你是因为用户喜欢 UWP 但不喜欢“暂停”(What the...suspended??)的想法而得到这个要求,恐怕你无法满足这个要求。

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

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

        【讨论】:

          【解决方案5】:

          根据this article in MSDN magazine,您还可以使用后台任务来保持应用程序处于活动状态。文章声称后台任务应该优先于扩展会话方法。

          BackgroundTask 实现

          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);
          }
          

          【讨论】:

            猜你喜欢
            • 2017-01-17
            • 2017-11-17
            • 1970-01-01
            • 2013-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多