Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone 8.1后台任务在完成前关闭_C#_Windows Phone 8.1_Windows Phone_Background Task - Fatal编程技术网

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

C# Windows Phone 8.1后台任务在完成前关闭,c#,windows-phone-8.1,windows-phone,background-task,C#,Windows Phone 8.1,Windows Phone,Background Task,我的后台任务需要很长时间才能完成,而操作系统正在扼杀它。我正在尝试在线同步我的联系人,下面是我正在做的: 从电话簿获取所有联系人(需要约1秒) 将它们上载到服务器(约2秒) 从服务器检索所有联系人(~2-3秒) 从ContactStore中删除所有联系人(ContactStore.DeleteAsync有时需要1分钟才能完成) 创建ContactStore并导入所有联系人)(1000个联系人约1-2分钟) 我有约100个联系人,工作正常,但我想用约1000个联系人进行测试,但并不是每次都能完成。

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

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

  • 将它们上载到服务器(约2秒)

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

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

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


  • 我有约100个联系人,工作正常,但我想用约1000个联系人进行测试,但并不是每次都能完成。我正在使用一个MaintenanceTrigger,但我认为它对于后台任务来说还是太多了,但我需要对此进行确认。应该允许MaintenanceTrigger任务执行更多资源密集型任务,那么为什么操作系统会终止我的后台任务?

    请查看以下链接:

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

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

    • 需要外部电源
    • 需要非蜂窝连接
    • 最小电池电量
    • 需要设备屏幕锁
    • 没有活动电话
    • 无法将网络更改为蜂窝网络
    此外,低端/高端设备的内存上限分别为11mb和20mb

    根据您上面的描述,最有可能的情况是内存上限被击中。也许这篇文章可以帮助您了解后台任务的内存使用情况:

    从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_funcap_EXTEND_MEM清单条目
    • ID_REQ_MEMORY_300清单条目仍然有效,但您应该让您的应用程序在所有设备上运行
    • 下面是ID_REQ_MEMORY_300的新等价物。此条目应添加到AppX清单(而不是WMAppManifest)

    呃。。。也许很傻,但是

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

    它工作时能插上电源吗?不工作时不能插上电源吗

    编辑:当您尝试“同步”联系人时,您是否考虑过手机有多忙?您是否通过电池节省器强制应用程序始终在后台运行

    你可以这样做,看看你的手机有多忙。。。或者,如果达到下载大小等限制,可能是节电器使应用程序停止运行

    从这里开始

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

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

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

    如果没有看到一些代码,很难回答这个问题。我想到的是,可能你的后台任务占用了太多的cpu、内存,或者需要很长时间才能完成,所以手机正在停止它。如果我使用了维护触发器,那么即使需要很长时间,任务是否应该被允许完成?手机正在充电,如果是资源密集型的,应该不会有问题task@thewindev请编辑您的问题,以明确1000个联系人不需要1-2分钟。。。但正如你后来指出的12分钟。。。你的问题会误导未来的读者。事实上,在某些情况下需要2-3分钟,在其他情况下需要12分钟。我的应用程序是针对WP 8.1的,而不是WP 8的,因此我认为内存需求增加了。无论如何,我的任务最多消耗12MB,我的设备是运行在Windows10最新版本上的Lumia930。所有这些限制都得到了满足。我忘了说有时任务完成了,有时没有。我不确定内存限制是否增加了。我找不到任何说明Windows Phone 8.1有任何更改的更新文档。@thewindev“您可以使用DeviceExtendedProperties.GetValue(字符串)检查应用程序工作设置限制值,以检查应用程序可用的内存限制。”方法。有关如何执行此操作的示例,请参阅如何禁用适用于Windows Phone 8的低内存手机的应用程序中的功能。“摘自我所做的,我使用14 MB/115 MB(限制)。我使用MemoryManager获取内存使用情况和内存限制。因此,记忆似乎不是一种记忆issue@KasperHoldum因为被接受的答案实际上在你给出的链接中得到了回答,而不是在你的帖子中。。。为了防止这可能是一个“仅链接”的答案(其余的都是模糊的),请您从链接中提取答案并编辑到您的帖子中。不傻:)但任务在不使用交流电源时不会触发,所以这不是问题所在issue@thewindev此外,这可能会为您@thewindev提供一些见解,您也可以尝试使用IBackgroundTaskRegistration对象的进度事件。。。例如在