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

时间:2016-02-20 17:09:14

标签: c# windows-phone-8.1 windows-phone background-task

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

资源密集型任务的有效期限为10分钟。

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

  • 需要外部电源
  • 需要非蜂窝连接
  • 最低电池电量
  • 需要设备屏幕锁定
  • 暂无接听电话
  • 无法将网络更改为手机

此外,对于低端/高端设备,还有分别为11mb和20mb的存储器容量。

从上面的描述中,最有可能的情况是IMO是被击中的内存上限。也许这篇文章可以帮助您查看后台任务的内存使用情况: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 Runtime)的应用程序的上限略高于Windows Phone 8应用程序。
  • 所有应用类型的内存上限,包括连续后台执行(CBE),随着内存的增加而扩展。
  • 不再有“默认”和“更高”上限 - 只有默认上限。
  • 在Windows Phone 8.1上运行的所有应用都会忽略ID_FUNCCAP_EXTEND_MEM清单条目。
  • ID_REQ_MEMORY_300清单条目仍然有效,但您确实应该在所有设备上运行您的应用。
  • 下面是ID_REQ_MEMORY_300的新等价物。此条目应添加到AppX清单(而不是WMAppManifest)。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

它可以在电源工作时插入电源吗?如果不工作则不插电?

编辑:您是否正在考虑尝试“同步”联系人时手机的繁忙程度?您是否通过省电模式强制应用程序在后台运行?

你可以做一些这样的事情,看看你的手机有多忙......或者如果达到下载大小等限制就可以暂停你的应用程序...

从这里采取......

var result = await BackgroundExecutionManager.RequestAccessAsync();

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

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