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

在我的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.为什么上述代码有效,因为文档清楚地说“后台任务仅限于30秒的挂钟使用”?

正如在后台任务资源限制中所说:

后台任务限制为30秒的挂钟使用。

此约束也适用于TimeTrigger。 但是你的代码有效,我想这是因为你正在用Visual Studio调试你的后台任务。 附加Visual Studio调试器后,Visual Studio将控制后台任务。 后台任务可以帮助开发人员进行调试。 如果没有调试器,OS应取消超过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应用程序,请参阅打包UWP应用程序 )。 一旦后台任务被触发,我们就可以在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 

只有“第一活动”没有“第二活动”。 在事件视图中 ,我们可以获得如下信息:
在此处输入图像描述 这些信息位于应用程序和服务日志→Microsoft→Windows→BackgroundTaskInfrastructure→Operational下

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

没有关于每种触发类型的CPU配额的文档。 参考背景任务指南 :

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

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