Windows Phone 后台任务提前停止。

7
我在开发一个WP8.1 SL应用程序,该应用程序使用后台任务(不是代理!)。 我的任务由TimerTrigger触发-每30分钟一次(我相信这是Windows Phone的最小间隔,对吗?)。它正在做很多工作,但出于某种原因,有时会被中断-也就是说,它在中途停止。我知道它在中途停止是因为我记录了发生的情况,并且任务的工作基本上每次都是一样的。
昨天我将应用程序部署到设备上以测试新方法,一切正常-后台任务每次启动时都完成所有工作-非常完美。今天我的设备需要进行软重置,所以我这样做了(什么都不起作用,自从我升级到WP8.1以来,这种情况偶尔会发生)。从那一刻起,无论何时,后台任务都会在中途停止,就像之前的方法一样。
任何想法可能会导致这种情况发生?我认为它可能与软重置有关,因为-在此之前100%成功率,在此之后为0%。
我已经尝试的:我记录了错误,我用try-catch包围了一切,我订阅了UnobservedException事件和任务的Canceled事件,并记录了暂停计数-这些事情都没有帮助。似乎没有错误,它没有停止,也没有被取消。
我不确定的是:我不知道如何检查任务消耗的CPU时间。我找不到一个好的/可靠的方法来这样做。此外,我找不到任何可以解释为什么任务有时会在中途停止,而其他时候会正常工作的信息。
您有什么想法吗?为什么我的后台任务有时会在中途停止?我真的很难确定如何修复/改进应用程序并且是否完全可以工作。谢谢。

这是一个有点难的问题,因为在 WP 后台任务中有许多限制(您可能已经知道了 :)。CPU 配额仅为 2 秒 - 可能是这个原因?另外,您是否调用了 RequestAccessAsync?还有,您是否正在通过网络传输任何数据? - Romasz
也许需要一些测试:手机是否有电会有差别吗?你能否运行一个秒表,并在任务运行时在LocalSettings中通知时间?你能否构建一个简单的任务,在其中等待超过2秒,并查看它是否被取消?此外,我假设你正在获取延迟。 - Romasz
嘿@Romasz!:)感谢您的建议。我知道有3个限制——CPU(不确定如何检查)、内存(已检查)和数据传输(未使用)。我经常调用RequestAccessAsync。CPU约束是指CPU时间,而不是实际运行时间。当它在执行所有任务时,运行时间为10-15秒。无论手机是否充电/电池电量为20%/100%,似乎都不会对任务的执行产生任何影响。而且您的假设是正确的——我正在获取延迟,并在最后(在finally块中)调用Complete方法。 - yasen
没有,我的代码中没有任何延迟或睡眠设置。我已经在诺基亚929和三星Huron上进行了检查。 - golldy
@TimChard 感谢提供信息(很抱歉我没有及时回复)!我知道这些,但是我无法使用它们来确定问题。无论如何,我刚刚发布了解决我的问题的内容。你可以查看并分享你的想法。 - yasen
显示剩余11条评论
1个回答

13

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

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

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

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

当我测试同一应用程序的相同构建时,其后台任务在一个设备上运行了40分钟,而在另一个设备上只运行了3-4秒钟。在我重新启动第一个设备之后,后台任务开始正常工作(只运行了几秒钟)。

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

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

附言:这可能不是完美的答案,但这些是我的观察结果,并且它们帮助我解决了我的问题。到目前为止,这是我找到的测试CPU时间的最佳方法,但仍然存在缺陷。因此,如果有更好的方法,请分享。


这个很难找到。感谢提供信息。你有没有偶然检查过,这个限制是与 CPU 使用时间相关联的,还是从任务开始计算的?例如,你运行一个任务并执行 await Task.Delay(20000);(当然在某个地方要有延迟),它会被终止还是之后的代码会继续运行? - Romasz
@Romasz 它与 CPU 使用率相关联(因此最好使用低端设备进行测试,以防万一 :))。然而,5 分钟后任务会被取消,原因是“空闲”。取消事件将因此而引发。因此,如果它没有使用太多的 CPU 时间并且使用了大量的 Task.Delay,它可以正常运行约 5 分钟。 - yasen
感谢提供信息 - 是的,这可能是低端设备的一个很好的陷阱。我想知道是否可能设置某种定时器,例如每3分钟调用一次,以延长任务的生存时间 - 我将不得不构建一个简单的示例。再次感谢您提供的有用信息。 - Romasz
我遇到了同样的问题。即使进入了运行方法,但运行方法代码仍然无法正常工作。之后它突然从循环中退出。为了相同的后台任务,我创建了一个示例项目,它可以正常工作。我找不到原因。 - asitis

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