7

我正在开发一个使用后台任务(不是代理!)的 WP8.1 SL 应用程序。

我的任务由 TimerTrigger 触发 - 每 30 分钟一次(我相信这是 Windows Phone 的最小间隔,对吧?)。它正在做很多工作,并且由于某种原因,有时它会被打断——也就是说,它会在中间停下来。我知道它在中间的方式是因为我记录了正在发生的事情,并且每次任务的工作基本上都是相同的。

我昨天将应用程序部署到我的设备上以测试一种新方法,一切正常 - 后台任务每次启动时都在做所有事情 - 就像一个魅力。今天我的设备需要软重置,所以我做了(没有任何工作,自从我更新到 WP8.1 后它时常发生)。从那一刻起,后台任务每次都被中断,就在它的中间,就像以前的方法一样。

有什么想法会导致这种情况吗?我认为它可能与软重置有关,因为 - 之前的成功率为 100%,之后的成功率为 0%。

到目前为止我已经尝试过:

  • 我正在记录错误,我对所有事情都有尝试,我已经订阅了 UnobservedException 事件和任务的 Canceled 事件,并且我正在记录暂停计数 - 这些都没有帮助。似乎没有错误,没有暂停,也没有取消。

  • 我不时记录当前的内存使用情况,大约是 16-17MB。在我的设备上,限制应该是 30MB,所以我认为这不是问题。

  • 我尽可能地调用 RequestAccessAsync 。我认为一次就足够了,但是由于那个软重置问题,我决定将它放在其他 1-2 个地方以检查它是否导致问题。好吧,它不是,或者至少这没有解决它。

我不确定的是:

  • 我不知道如何检查我的任务消耗的 CPU 时间。我找不到这样做的好/可靠的方法。此外,我找不到任何信息可以解释为什么任务有时会在中间停止,有时会停止 - 它会正常工作。

任何想法为什么我的后台任务有时会在中间停止?我真的很难确定如何修复/改进应用程序以及它是否能正常工作。

谢谢。

4

1 回答 1

13

所以,我想我找到了我的问题所在。

首先,后台任务只是需要大量的CPU时间,超过了限制,这就是为什么它在中间被杀死的原因。

它有时工作的原因是因为有时我正在测试的设备将应用程序视为处于调试状态(或附加调试器)。在这种情况下,取消了对 CPU 时间的限制。

因此,即使我卸载应用程序并在 Release 中重建它并重新部署,并在没有附加调试器的情况下启动它,设备也没有强制执行约束。仅当我在部署后至少使用调试器启动应用程序一次(或者可能是第一次)时,才会发生这种情况。重新启动设备(只需关闭电源然后打开)即可解决此问题。

当我使用相同版本的应用程序进行测试时,它的后台任务在一台设备上运行了40 分钟,而在另一台设备上只运行了 3-4 秒。在我重新启动第一台设备后,后台任务开始正常运行(仅运行几秒钟)。

所以,如果你想测试你的后台任务的 CPU 约束:

  1. 您必须在设备上进行测试,而不是在模拟器上。
  2. 卸载应用程序(如果已安装)。
  3. 重启设备。
  4. 部署应用程序的发布版本。
  5. 运行应用程序,使其可以注册后台任务,然后将其关闭。
  6. 等待调用后台任务。(您可以添加一个可以强制的触发器,例如 TimeZoneChanged 或 UserPresent,以便您可以快速测试它。)

PS这可能不是完美的答案,但这些是我的观察,它们帮助我解决了我的问题。到目前为止,这是我找到的测试 CPU 时间的最佳方法,但它远非完美。所以,如果有人有更好的想法,请分享。

于 2014-07-09T12:39:23.433 回答