Windows Phone后台任务提前停止

yas*_*sen 7 windows-runtime windows-phone-8.1 background-task

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

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

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

有什么想法可以导致这个?我认为它可能与软复位有关,因为 - 之前100%的成功率,之后是0%.

到目前为止我尝试过的:

  • 我正在记录错误,我有一个try-catch周围的东西,我已经订阅了UnobservedException事件和任务的Canceled事件,我正在记录暂停计数 - 这些都没有帮助.似乎没有错误,它没有被暂停,也没有被取消.

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

  • 我在任何地方都在调用RequestAccessAsync.我认为曾经应该足够了,但自从那次软重置问题以来,我决定把它放在其他1-2个地方,以检查是否会导致问题.嗯,它不是,或者至少没有解决它.

我不确定的是什么:

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

任何想法为什么我的后台任务有时会停在中间?我真的很难确定如何修复/改进应用程序,并且它会起作用.

谢谢.

yas*_*sen 13

所以,我想我发现了我的问题.

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

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

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

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

因此,如果要测试CPU约束的后台任务:

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

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