UWP:为啥我的后台任务(使用 TimeTrigger)会超出 CPU 配额?
Posted
技术标签:
【中文标题】UWP:为啥我的后台任务(使用 TimeTrigger)会超出 CPU 配额?【英文标题】:UWP: Why can I exceed the CPU quota with my background task (using TimeTrigger)?UWP:为什么我的后台任务(使用 TimeTrigger)会超出 CPU 配额? 【发布时间】:2016-08-30 19:47:16 【问题描述】:在我的 UWP 应用程序中,我有一个由 TimeTrigger 触发的后台任务。在后台任务的代码中,我有这个 sn-p(我的示例中的“第一个活动”和“第二个活动”几乎不消耗任何资源):
var deferral = args.TaskInstance.GetDeferral();
await Task.Run(async () =>
//... first activity
await Task.Delay(TimeSpan.FromSeconds(90.0));
//... second activity, 90 seconds later
);
所以我的问题是:
为什么上面的代码可以工作,因为文档清楚地说明“后台任务限制在 30 秒的挂钟使用时间”?
每个 TriggerType 的 CPU 配额记录在哪里?
【问题讨论】:
【参考方案1】:1.为什么上面的代码可以工作,因为文档清楚地说“后台任务限制在 30 秒的挂钟使用时间”?
正如Background task resource constraints中所说:
后台任务的使用时间限制为 30 秒。
此约束也适用于 TimeTrigger。但是您的代码有效,我想这是因为您正在使用 Visual Studio 调试后台任务。附加 Visual Studio 调试器后,Visual Studio 将控制后台任务。后台任务用于帮助开发人员调试。如果没有调试器,超过 CPU 配额的后台任务应该被操作系统取消。
例如,如果我们使用如下后台任务:
public sealed class MyBackgroundTask : IBackgroundTask
public async void Run(IBackgroundTaskInstance taskInstance)
var deferral = taskInstance.GetDeferral();
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Test.txt", CreationCollisionOption.OpenIfExists);
await FileIO.AppendTextAsync(file, $"DateTime.Now.ToString() first activityEnvironment.NewLine");
await Task.Delay(TimeSpan.FromSeconds(90.0));
await FileIO.AppendTextAsync(file, $"DateTime.Now.ToString() second activityEnvironment.NewLine");
deferral.Complete();
然后通过旁加载这个应用程序包来测试它。 (有关如何旁加载 UWP 应用程序,请参阅Packaging UWP apps)。一旦触发了后台任务,我们可以在Test.txt文件中找到(该文件通常在%USERPROFILE%\AppData\Local\Packages\Package family name\LocalState
下),输出如下:
9/2/2016 3:06:35 PM first activity
9/2/2016 3:20:15 PM first activity
只有“第一活动”没有“第二活动”。而在事件视图中,我们可以得到如下信息: 这些信息位于Application and Services Logs → Microsoft → Windows → BackgroundTaskInfrastructure → Operational。
2.每个 TriggerType 的 CPU 配额记录在哪里?
没有关于每种触发器类型的 CPU 配额的文档。参考Background task guidance:
CPU 配额:后台任务受限于它们根据触发器类型获得的挂钟使用时间量。大多数触发器被限制为 30 秒的挂钟使用时间,而有些触发器能够运行长达 10 分钟以完成密集任务。
只有ApplicationTrigger
、MaintenanceTrigger
和DeviceUseTrigger
等少数触发器的使用时间超过 30 秒。后台任务应该是轻量级的,以节省电池寿命并为前台应用程序提供更好的用户体验。最好只在后台运行轻量级代码并使其在 30 秒内完成。
【讨论】:
很好的答案,恰到好处。 您说“没有关于每种触发器类型的 CPU 配额的文档”,但您也知道ApplicationTrigger
等的使用时间更长。为什么没有记录?没有文档,你怎么知道?以上是关于UWP:为啥我的后台任务(使用 TimeTrigger)会超出 CPU 配额?的主要内容,如果未能解决你的问题,请参考以下文章