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

重要的 API

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

与进程外后台任务相比,进程内后台任务更易于实现。 但是,它们不够灵活。 如果在进程内后台任务中运行的代码崩溃,这将降低你的应用的性能。 另请注意,DeviceUseTriggerDeviceServicingTriggerIoTStartupTask 无法与进程内模型一起使用。 也无法在你的应用程序内激活 VoIP 后台任务。 这些触发器和任务仍支持使用进程外后台任务模型。

请注意,如果后台活动的运行时间超过执行时间限制,即使在应用的前台进程内运行,后台活动也会终止。 出于某些目的,复原将工作分离到可在单独进程中运行的后台任务仍然有用。 对于不需要与前台应用程序通信的工作,最好是使后台任务作为独立于前台应用程序的任务工作。

基础知识

进程内模型可通过应用在前台运行还是在后台运行的改进通知增强应用程序生命周期。 对于这些过渡,Application 对象提供了两个新事件:EnteredBackgroundLeavingBackground。 基于你的应用程序的可见性状态,这些事件适合应用程序生命周期。在应用生命周期中阅读有关这些事件的详细信息,以及它们如何影响应用程序生命周期。

在较高级别上,处理 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. “留空”将启用默认入口点,这是 Application 对象上名为 OnBackgroundActivated () 的新受保护方法。

注册触发器后,将基于在 SetTrigger 方法中设置的触发器类型引发它。 在上面的示例中,使用 TimeTrigger,这将在注册之后的十五分钟引发。

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

在触发器事件发生后,你可以添加条件控制任务何时运行。 例如,如果你不希望在用户存在前运行任务,请使用条件 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 引用