创建和注册进程内后台任务

重要的 API

本主题演示如何创建和注册在应用所在的同一进程中运行的后台任务。

进程内后台任务比进程外后台任务更容易实现。 但是,它们的复原能力较低。 如果进程内后台任务中运行的代码崩溃,它将关闭你的应用。 另请注意, DeviceUseTriggerDeviceServicingTriggerIoTStartupTask 不能与进程内模型一起使用。 也不可能在应用程序中激活 VoIP 后台任务。 这些触发器和任务仍支持使用进程外后台任务模型。

请注意,即使后台活动在应用的前景进程中运行,如果后台活动运行超过执行时间限制,也会终止。 出于某种目的,将工作拆分为在单独进程中运行的后台任务的复原能力仍然很有用。 将后台工作作为与前台应用程序分开的任务可能是不需要与前台应用程序通信的工作的最佳选项。

基础

进程内模型通过改进的应用处于前台或后台时通知来增强应用程序生命周期。 这些转换的 Application 对象提供了两个新事件:EnteredBackground 和 LeavingBackground 这些事件根据应用程序的可见性状态适应应用程序生命周期,详细了解这些事件,以及这些事件如何影响应用生命周期

概括而言,你将处理 EnteredBackground 事件,以运行在后台运行应用时将执行的代码,并处理 LeavingBackground 以了解应用何时移动到前台。

注册后台任务触发器

进程内后台活动与进程外后台活动注册得大致相同。 所有后台触发器都从使用 BackgroundTaskBuilder 注册开始。 通过一个位置设置所有必需值,生成器可以轻松注册后台任务:

var builder = new BackgroundTaskBuilder();
builder.Name = "My Background Trigger";
builder.SetTrigger(new TimeTrigger(15, true));
// Do not set builder.TaskEntryPoint for in-process background tasks
// Here we register the task and work will start based on the time trigger.
BackgroundTaskRegistration task = builder.Register();

注意

通用 Windows 应用必须在注册任何后台触发器类型之前调用 RequestAccessAsync。 若要确保通用 Windows 应用在你发布更新后继续正常运行,必须在启动已经过更新的应用时调用 RemoveAccess,然后调用 RequestAccessAsync。 有关详细信息,请参阅后台任务指南

对于进程内后台活动,未将 TaskEntryPoint. “离开”设置为空会启用默认入口点,这是应用程序对象上名为 OnBackgroundActivated()的新受保护方法。

注册触发器后,它将根据 SetTrigger 方法中的触发器集的类型触发。 在上面的 示例中,使用 TimeTrigger ,这将从注册时间起 15 分钟触发。

添加条件以控制任务何时运行(可选)

可以添加条件来控制任务在触发事件发生后何时运行。 例如,如果不希望任务在用户存在之前运行,请使用条件 UserPresent。 有关可能条件的列表,请参阅 SystemConditionType

以下示例代码分配一个要求用户存在的条件:

builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));

将后台活动代码置于 OnBackgroundActivated()

将你的后台活动代码放入 OnBackgroundActivated,以便在后台触发器触发时对其进行响应。 OnBackgroundActivated 可以像 IBackgroundTask.Run 一样处理。 该方法具有 BackgroundActivatedEventArgs 参数,其中包含 Run 方法提供的所有内容。 例如,在 App.xaml.cs 中:

using Windows.ApplicationModel.Background;

...

sealed partial class App : Application
{
  ...

  protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
  {
      base.OnBackgroundActivated(args);
      IBackgroundTaskInstance taskInstance = args.TaskInstance;
      DoYourBackgroundWork(taskInstance);  
  }
}

有关更丰富的 OnBackgroundActivated 示例,请参阅将应用服务转换为与其主机应用在同一个进程中运行

处理后台任务进度和完成

可以通过与多进程后台任务(请参阅 “监视后台任务进度和完成”)相同的方式监视任务进度和完成,但可能会发现,通过使用变量跟踪应用中的进度或完成状态,可以更轻松地跟踪它们。 这是让后台活动代码与应用在同一进程中运行的优点之一。

处理后台任务取消

进程内后台任务与进程外后台任务取消的方式相同(请参阅 处理已取消的后台任务)。 请注意, 你的 BackgroundActivated 事件处理程序必须在取消发生之前退出,否则整个进程都将终止。 如果在取消后台任务时前台应用意外关闭,请验证处理程序是否在取消之前退出。

清单

与进程外后台任务不同,无需将后台任务信息添加到包清单,才能运行进程内后台任务。

总结和后续步骤

现在应了解如何编写进程内后台任务的基础知识。

有关 API 参考、后台任务概念指南以及编写使用后台任务的应用的更详细说明,请参阅以下相关主题。

详细的后台任务说明主题

后台任务指南

后台任务 API 参考