【问题标题】:Windows Phone 8.1 background task closes before completionWindows Phone 8.1 后台任务在完成前关闭
【发布时间】:2016-06-02 06:27:29
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 真的很难在没有看到一些代码的情况下回答这个问题。想到的事情可能是您的后台任务使用了过多的 cpu、内存,或者需要很长时间才能完成,所以手机正在杀死它
  • 如果我使用维护触发器,是否应该允许任务完成,即使它需要很长时间?手机正在充电,所以如果它是一项资源密集型任务应该不是问题
  • @thewindev 请编辑您的问题,以明确表示 1000 个联系人不是 1-2 分钟...而是您后来指出的 12 分钟...您的问题具有误导性和混淆性未来的读者。
  • 其实,有的需要2-3分钟,有的需要12分钟

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


【解决方案1】:

看看这个链接: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)。

【讨论】:

  • 我的应用程序是 WP 8.1,而不是 WP 8,所以我认为内存需求增加了。无论如何,我的任务最多消耗 12 MB,而我的设备是在 Windows 10 最新版本上运行的 Lumia 930。所有这些限制都得到满足。忘了说,有时任务完成了,有时还没有。
  • 我不确定内存限制是否增加。我找不到任何说明 Windows Phone 8.1 发生任何变化的更新文档。
  • @thewindev "您可以通过使用 DeviceExtendedProperties.GetValue(String) 方法检查 ApplicationWorkingSetLimit 值来检查应用程序可用的内存限制。有关如何执行此操作的示例,请参阅如何禁用功能在适用于 Windows Phone 8 的低内存手机的应用程序中。”取自msdn.microsoft.com/en-us/library/windows/apps/…
  • 我这样做了,我使用了 14 MB/115 MB(限制)。我使用 MemoryManager 来获取内存使用情况和内存限制。所以看来内存不是问题
  • @KasperHoldum 因为接受的答案实际上是在您提供的链接中回答的,而不是在您的帖子的文本中......以防止这可能是一个“仅链接”的答案(其余的是绒毛)您能否从链接中提取答案并将其编辑到您的帖子中。
【解决方案2】:

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

【讨论】:

  • 如果您告诉我们需要 12 分钟而不是说最多需要 3 分钟,这将是明显的原因。我在答案中给出的链接指定最多 10 分钟作为约束。
  • 你是对的,我没有阅读整个页面,因为它是针对 Windows Phone 8 的,我会接受你的回答并给你赏金:)
【解决方案3】:

呃……可能有点傻,但是……

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

能不能工作时插上电源,不工作时不插上?

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

您可以执行这样的操作来查看您的手机有多忙...或者如果达到下载大小等限制,电池保护程序可能会停止您的应用...

取自这里...

var result = await BackgroundExecutionManager.RequestAccessAsync();

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

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

【讨论】:

  • 不傻 :) 但是当它没有使用交流电源时任务不会触发,所以这不是问题
  • @thewindev 这也可以为您提供一些见解code.msdn.microsoft.com/windowsapps/…
  • @thewindev 您也可以尝试使用 IBackgroundTaskRegistration 对象的 Progress 事件...如在后台任务中设置它并在您的应用程序中读取事件和值并记录它以查看是否它总是停在同一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多