UWP:为什么我可以通过后台任务(使用TimeTrigger)超过CPU配额?

时间:2016-08-30 19:47:16

标签: c# uwp background-task

在我的UWP应用程序中,我有一个由TimeTrigger触发的后台任务。在后台任务的代码中,我有这个片段("第一个活动""第二个活动"在我的示例中几乎不消耗任何资源):

var deferral = args.TaskInstance.GetDeferral();
await Task.Run(async () =>
{
    //... first activity

    await Task.Delay(TimeSpan.FromSeconds(90.0));

    //... second activity, 90 seconds later

});

所以我的问题是:

  1. 为什么上述代码有效,正如文档明确指出的那样"后台任务仅限于30秒的挂钟使用情况"

  2. 每个TriggerType记录的CPU配额在哪里?

1 个答案:

答案 0 :(得分:3)

  

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 activity{Environment.NewLine}");

        await Task.Delay(TimeSpan.FromSeconds(90.0));

        await FileIO.AppendTextAsync(file, $"{DateTime.Now.ToString()} second activity{Environment.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

只有"第一个活动"没有"第二次活动"。在活动视图中,我们可以获得以下信息:
enter image description here 这些信息位于应用程序和服务日志→Microsoft→Windows→BackgroundTaskInfrastructure→Operational

  

2.每个TriggerType记录的CPU配额是什么?

没有关于每种触发类型的CPU配额的文档。参考Background task guidance

  

CPU配额:后台任务受限于根据触发类型获得的挂钟使用时间。大多数触发器限制为30秒的挂钟使用,而一些触发器能够运行长达10分钟以完成密集型任务。

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