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 分钟以完成密集任务。

只有ApplicationTriggerMaintenanceTriggerDeviceUseTrigger 等少数触发器的使用时间超过 30 秒。后台任务应该是轻量级的,以节省电池寿命并为前台应用程序提供更好的用户体验。最好只在后台运行轻量级代码并使其在 30 秒内完成。

【讨论】:

很好的答案,恰到好处。 您说“没有关于每种触发器类型的 CPU 配额的文档”,但您也知道ApplicationTrigger 等的使用时间更长。为什么没有记录?没有文档,你怎么知道?

以上是关于UWP:为啥我的后台任务(使用 TimeTrigger)会超出 CPU 配额?的主要内容,如果未能解决你的问题,请参考以下文章

UWP FileWatcher 后台任务

后台任务 UWP - 使用数据传递对象

UWP:请求启动后台任务时出错

后台任务不在 UWP 中运行

UWP:后台任务中的音频媒体捕获

Uwp 在用户登录时执行后台任务