在 Windows 8.1 中创建设备后台任务(UWP 设备应用)

重要

设备元数据已弃用,并将在 Windows 的将来版本中删除。 有关替代功能的信息,请参阅驱动程序包容器元数据

UWP 应用可以在外围设备上同步数据。 如果应用与设备元数据相关联,则 UWP 设备应用还可以执行设备更新,例如固件更新。 本文介绍如何创建使用 DeviceUseTriggerDeviceServicingTrigger 的设备后台任务。 使用这些触发器的设备后台代理受策略的约束,这些策略可确保用户同意并帮助在同步和更新设备时保留电池使用时间。 有关设备后台任务的详细信息,请参阅 UWP 设备应用的设备同步和更新

本文对应于 自定义 USB 设备示例。 自定义 USB 设备示例演示了一个使用 DeviceUseTrigger 执行设备同步的后台任务。

尽管 自定义 USB 设备示例中 的设备后台任务具有 DeviceUseTrigger 的功能,但本文中讨论的所有内容也可以应用于使用 DeviceServicingTrigger 的设备后台任务。 使用这两个触发器时,唯一区别在于 Windows 所进行的策略检查。

应用程序清单

要使用设备后台任务,你的应用必须在前台应用的应用清单文件中声明,就像系统触发的后台任务一样。 有关详细信息,请参阅 UWP 设备应用的设备同步和更新

在此应用包清单文件中, DeviceLibrary.SyncContent 是前台应用的入口点。 DeviceLibrary.SyncContent 是使用 DeviceUseTrigger 的后台任务的入口点。

<Extensions>
  <Extension Category="windows.backgroundTasks" EntryPoint="DeviceLibrary.SyncContent">
    <BackgroundTasks>
      <m2:Task Type="deviceUse" /> 
    </BackgroundTasks>
  </Extension>
</Extensions>

设备后台任务

设备后台任务类实现 IBackgroundTask 接口,并包含为同步或更新外围设备而创建的实际代码。 后台任务类在触发后台任务后并从应用程序清单提供的入口点执行。

自定义 USB 设备示例中的设备后台类包含用于使用 DeviceUseTrigger 后台任务执行到 USB 设备的同步的代码。 有关完整详细信息,请下载示例。 有关实现 IBackgroundTask 和 Windows 后台任务基础结构的详细信息,请参阅 使用后台任务支持应用

自定义 USB 设备示例中设备后台任务的关键部分包括:

  1. IoSyncBackgroundTask 类实现 IBackgroundTask Windows 后台任务基础结构所需的接口。

  2. IoSyncBackgroundTask 类将获取在 IoSyncBackgroundTask 类的 Run 方法中传递给该类的 DeviceUseDetails 实例,并使用此实例将进度报告回 Microsoft Store 应用并注册取消事件。

  3. IoSyncBackgroundTask 类的 Run 方法还调用实现后台设备同步代码的私有 OpenDevice 方法和 WriteToDeviceAsync 方法。

前台应用

自定义 USB 设备示例中的前景应用注册并触发使用 DeviceUseTrigger 的设备后台任务。 本部分概述了前台应用注册、触发和处理设备后台任务进度所要执行的步骤。

自定义 USB 设备示例中的前景应用执行以下步骤以使用设备后台任务:

  1. 创建新的 DeviceUseTriggerBackgroundTaskRegistration 对象。

  2. 检查此应用以前是否已注册任何后台任务,并通过对任务调用 BackgroundTaskRegistration.Unregister 方法取消这些任务。

  3. 专用 SetupBackgroundTask 方法注册将与设备同步的后台任务。 在下一步中,SetupBackgroundTask 方法从 SyncWithDeviceAsync 方法调用。

    1. 初始化 DeviceUseTrigger 并保存它以供以后使用。

    2. 创建一个新BackgroundTaskBuilder对象并使用其NameTaskEntryPoint属性SetTrigger和方法注册应用DeviceUseTrigger的对象和后台任务名称。 TaskEntryPoint对象的BackgroundTaskBuilder属性设置为在触发后台任务时将运行的后台任务类的全名。

    3. 注册后台任务中的完成和进度事件,以便前台应用可以向用户提供完成和进度更新。

  4. 专用 SyncWithDeviceAsync 方法注册用于与设备同步的后台任务,并启动后台同步。

    1. 调用上一步的SetupBackgroundTask方法,并注册一个将与设备进行同步的后台任务。

    2. 调用启动后台任务的专用 StartSyncBackgroundTaskAsync 方法。 该方法将应用的句柄关闭到设备,以确保后台任务能够在设备启动时打开设备。

      重要

      后台任务需要打开设备才能执行更新,以便前台应用在调用 RequestAsync之前必须关闭其与设备的连接。

    接下来,StartSyncBackgroundTaskAsync方法调用DeviceUseTrigger对象的RequestAsync方法,该方法会启动并触发后台任务,并从RequestAsync返回DeviceTriggerResults对象,以确定后台任务是否启动成功。

    重要

    Windows 检查,以确保已完成所有必要的任务启动策略检查。 如果已完成所有策略检查,更新操作现在作为后台任务在前台应用之外运行,允许在操作进行期间安全地暂停应用。 如果不再满足这些要求,Windows 还将强制实施任何运行时要求,并取消后台任务。

  5. 最后,方法 SyncWithDeviceAsync 使用从 StartSyncBackgroundTaskAsync 返回的 DeviceTriggerResults 对象来确定后台任务是否已成功启动。 switch 语句用于检查来自 DeviceTriggerResults 的结果

  6. 前台应用实现了一个专用 OnSyncWithDeviceProgress 事件处理程序,它将根据设备后台任务的进度更新应用程序 UI。

  7. 前台应用实现专用 OnSyncWithDeviceCompleted 事件处理程序,以便在后台任务完成时处理从后台任务到前台应用的转换。

    1. 使用BackgroundTaskCompletedEventArgs对象的CheckResults方法来确定后台任务是否引发任何异常。

    2. 后台任务完成后,前台应用会重新打开设备供应用程序使用,并更新 UI 以通知用户。

  8. 前台应用实现 UI 中的专用按钮单击事件处理程序,以启动和取消后台任务。

    1. 专用 Sync_Click 事件处理程序调用 SyncWithDeviceAsync 前面步骤中所述的方法。

    2. 专用 CancelSync_Click 事件处理程序调用专用 CancelSyncWithDevice 方法以取消后台任务。

  9. 私有CancelSyncWithDevice 方法取消注册并终止任何活动设备同步,使设备能通过使用 BackgroundTaskRegistration.Unregister 方法重新开启。