我的后台任务需要很长时间才能完成,操作系统正在杀死它。我正在尝试在线同步我的联系人,这就是我正在做的事情:
从电话簿中获取所有联系人(需要约1秒钟)
将它们上传到服务器(约2秒)
从服务器检索所有联系人(~2-3秒)
从ContactStore删除所有联系人(ContactStore.DeleteAsync有时需要1分钟才能完成)
创建一个ContactStore并导入所有联系人)(1000个联系人约1-2分钟)
我有~100个联系人并且它运行良好,但我想用~1000个联系人进行测试,但每次都没有完成。我正在使用MaintenanceTrigger,但我认为它对于后台任务来说仍然太多了,但我需要对此进行确认。应该允许MaintenanceTrigger任务执行更多资源密集型任务,那么为什么操作系统会终止我的后台任务呢?
答案 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):
答案 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.
}
“如果结果被拒绝,手机会认为它有太多的后台任务处于活动状态。在这种情况下,您可以提示您的用户使用省电模式应用程序并强制允许您的应用程序在后台运行,即使手机不在我想......“