Windows Phone 8.1后台任务在完成之前关闭

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

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

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

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

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

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

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

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

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

在启动任务之前,必须满足以下约束。 如果设备停止满足这些约束,则代理将立即终止。

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

除此之外,还有一个分别为11mb和20mb的存储器盖,用于低端/高端设备。

根据您的描述,最可能出现的情况是IMO是被击中的内存上限。 也许这篇文章可以帮助你研究后台任务的内存使用情况: 如何在C#中获取或使用内存

从Windows Phone 8.1开始的内存限制的主要更改包括(在此处找到):

  • 所有Windows Phone 8前台应用程序都被视为相同。 我们不再为XNA,原生或Silverlight应用程序提供不同的内存上限。
  • Windows Phone 8.1应用程序(包括Silverlight 8.1和Windows Runtime)应用程序的上限略高于Windows Phone 8应用程序。
  • 所有应用类型的内存上限,包括连续后台执行(CBE),随着内存的增加而扩展。
  • 不再有“默认”和“更高”上限 – 只有默认上限。
  • 对于在Windows Phone 8.1上运行的所有应用程序,将忽略ID_FUNCCAP_EXTEND_MEM清单条目。
  • ID_REQ_MEMORY_300清单条目仍然有效,但您应该确实在所有设备上运行您的应用程序。
  • ID_REQ_MEMORY_300的新等价物如下。 此条目应添加到AppX清单(而不是WMAppManifest)。

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

呃…可能很傻但是……

“使用维护触发器的后台任务仅在系统连接到交流电源时运行。” 取自MSDN

它可以在工作时插入主电源吗?当它不工作时没有插上电源?

编辑:当你试图“同步”联系人时,你在考虑手机有多忙吗? 您是否通过省电模式强制应用程序在后台运行?

你可以做这样的事情,看你的手机有多忙……或者如果达到了下载大小等限制,它可能会停止你的应用程序的电池保护程序…

从这里开始……

var result = await BackgroundExecutionManager.RequestAccessAsync(); if (result == BackgroundAccessStatus.Denied) { // Handle this if it is important for your app. } 

“如果结果被拒绝,手机会认为它有太多的后台任务处于活动状态。在这种情况下,你可以提示用户使用省电模式应用程序并强制允许你的应用程序在后台运行,即使手机不想要……”