Windows Phone 8.1 后台任务未完成就关闭

Windows Phone 8.1 background task closes before completion

我的后台任务需要很长时间才能完成,OS 正在终止它。我正在尝试在线同步我的联系人,这是我正在做的事情:

  1. 从电话簿中获取所有联系人(大约需要 1 秒)

  2. 将它们上传到服务器(~2 秒)

  3. 从服务器检索所有联系人(~2-3 秒)

  4. 从 ContactStore 中删除所有联系人(ContactStore.DeleteAsync 有时需要 1 分钟才能完成)

  5. 创建一个 ContactStore 并导入所有联系人)(1000 个联系人大约需要 1-2 分钟)

我有约 100 个联系人,并且运行良好,但我想用约 1000 个联系人进行测试,但并非每次都能完成。我正在使用 MaintenanceTrigger,但我认为它对于后台任务来说仍然太多了,但我需要对此进行确认。应该允许 MaintenanceTrigger 任务执行更多资源密集型任务,那么为什么 OS 会终止我的后台任务?

看看这个link:https://msdn.microsoft.com/en-us/library/windows/apps/hh202942(v=vs.105).aspx

资源密集型任务的持续时间限制为 10 分钟。

在开始任务之前必须满足以下限制条件。如果设备停止满足这些约束,代理将立即终止。

  • 需要外部电源
  • 需要非蜂窝网络连接
  • 最小电池电量
  • 需要设备屏幕锁定
  • 没有活动 phone 通话
  • 无法将网络更改为蜂窝网络

除此之外,low/high 终端设备的内存上限分别为 11mb 和 20mb。

根据您上面的描述,IMO 最有可能发生的情况是内存容量达到上限。也许这个 post 可以帮助您查看后台任务的内存使用情况:How to get memory available or used in C#

从 Windows Phone 8.1 开始对内存限制的主要更改包括(发现 here):

  • 所有Windows Phone 8 个前台应用程序被同等对待。我们不再为 XNA、本机或 Silverlight 应用程序设置不同的内存上限。
  • Windows Phone 8.1 应用程序(包括 Silverlight 8.1 和 Windows 运行时)应用程序的上限确实比 Windows Phone 8 应用程序的上限略高。
  • 所有应用类型的内存上限,包括持续后台执行 (CBE),随着内存的增加而增加。
  • 不再有 "default" 和 "higher" 上限 - 只有默认上限。
  • 在 Windows Phone 8.1.
  • 上 运行ning 的所有应用程序将忽略 ID_FUNCCAP_EXTEND_MEM 清单条目
  • ID_REQ_MEMORY_300 清单条目仍然有效,但您确实应该在所有设备上制作您的应用 运行。
  • ID_REQ_MEMORY_300 的新等价物如下。此条目应添加到 AppX 清单(而不是 WMAppManifest)。

嗯...可能很傻但是...

"Background tasks that use a maintenance trigger run only when the system is connected to AC power." 取自 MSDN

能不能用的时候插上电源,不用的时候不插?

编辑: 当您尝试 'sync' 联系人时,您是否考虑过 phone 有多忙?您是否通过省电模式强制应用程序始终 运行 在后台运行?

您可以执行类似的操作来查看您的 phone 有多忙...或者它可能是节电程序在达到下载大小等限制时停止您的应用程序...

取自此处...

var result = await BackgroundExecutionManager.RequestAccessAsync();

if (result == BackgroundAccessStatus.Denied)
{
    // Handle this if it is important for your app.
}

"If the result is denied the phone thinks it has too much background task active. In that case you can prompt your users to go the Battery saver application and force allow your app to run in the background even if the phone don´t want to..."

最后,我的任务因 ExecutionTimeExceeded 原因而被取消,这就是问题所在。似乎尝试在 ContactStore 中导入约 1000 个联系人需要约 12 分钟,这对于后台任务来说太长了。我必须让用户打开应用程序并进行导入。感谢您的帮助。