在我的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
});
所以我的问题是:
为什么上述代码有效,正如文档明确指出的那样"后台任务仅限于30秒的挂钟使用情况"
每个TriggerType记录的CPU配额在哪里?
答案 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
只有"第一个活动"没有"第二次活动"。在活动视图中,我们可以获得以下信息:
这些信息位于应用程序和服务日志→Microsoft→Windows→BackgroundTaskInfrastructure→Operational 。
2.每个TriggerType记录的CPU配额是什么?
没有关于每种触发类型的CPU配额的文档。参考Background task guidance:
CPU配额:后台任务受限于根据触发类型获得的挂钟使用时间。大多数触发器限制为30秒的挂钟使用,而一些触发器能够运行长达10分钟以完成密集型任务。
只有少数触发器(如ApplicationTrigger
,MaintenanceTrigger
和DeviceUseTrigger
的使用时间超过30秒。后台任务应该是轻量级的,以节省电池寿命并为前台应用程序提供更好的用户体验。仅在后台运行轻量级代码并在30秒内完成后,这是一个很好的做法。