在 UWP 应用更新时运行后台任务
了解如何编写在更新 通用 Windows 平台 (UWP) 应用商店应用后运行的后台任务。
当用户将更新安装到设备上安装的应用后,操作系统将调用更新任务后台任务。 这样,应用就可以在用户启动更新的应用之前执行初始化新推送通知通道、更新数据库架构等初始化任务。
更新任务不同于使用 ServicingComplete 触发器启动后台任务,因为在这种情况下,应用必须在更新之前至少运行一次,以便注册 ServiceingComplete 触发器将激活的后台任务。 更新任务未注册,因此从未运行过但已升级的应用仍会触发其更新任务。
步骤 1:创建后台任务类
与其他类型的后台任务一样,可以将“更新任务”后台任务作为Windows 运行时组件实现。 若要创建此组件,请按照“创建创建”的“创建后台任务”类部分中的步骤操作并注册进程外后台任务。 步骤包括:
- 向你的解决方案添加一个 Windows 运行时组件项目。
- 从应用创建对组件的引用。
- 在实现 IBackgroundTask 的组件中创建公共密封类。
- 实现 Run 方法,这是运行更新任务时调用的必需入口点。 如果要从后台任务进行异步调用,请创建和注册进程外后台任务,说明如何在 Run 方法中使用延迟。
无需注册此后台任务(在“创建”中创建和注册进程外后台任务主题中的 “注册要运行的后台任务 ”部分)才能使用更新任务。 这是使用更新任务的主要原因,因为无需向应用添加任何代码来注册任务,并且应用不必至少在更新之前运行一次才能注册后台任务。
以下示例代码显示了 C# 中更新任务后台任务类的基本起点。 后台任务类本身(以及后台任务项目中的所有其他类)需要 公开 和 密封。 后台任务类必须派生自 IBackgroundTask ,并且具有如下所示的签名的公共 Run() 方法:
using Windows.ApplicationModel.Background;
namespace BackgroundTasks
{
public sealed class UpdateTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
// your app migration/update code here
}
}
}
步骤 2:在包清单中声明后台任务
在 Visual Studio 解决方案资源管理器中,右键单击 Package.appxmanifest,然后单击“查看代码”以查看包清单。 添加以下 <Extensions>
XML 来声明更新任务:
<Package ...>
...
<Applications>
<Application ...>
...
<Extensions>
<Extension Category="windows.updateTask" EntryPoint="BackgroundTasks.UpdateTask">
</Extension>
</Extensions>
</Application>
</Applications>
</Package>
在上面的 XML 中,确保属性 EntryPoint
设置为 update 任务类的 namespace.class 名称。 该名称区分大小写。
步骤 3:调试/测试更新任务
确保已将应用部署到计算机,以便更新某些内容。
在后台任务的 Run() 方法中设置断点。
接下来,在解决方案资源管理器中,右键单击应用的项目(而不是后台任务项目),然后单击“ 属性”。 在应用程序属性窗口中,单击左侧的“调试”,然后选择“不启动”,但在启动代码时调试代码:
接下来,若要确保触发 UpdateTask,请增加包的版本号。 在解决方案资源管理器中,双击应用的 Package.appxmanifest 文件打开包设计器,然后更新内部版本号:
现在,在 Visual Studio 2019 中按 F5 时,你的应用将更新,系统将在后台激活你的 UpdateTask 组件。 调试器将自动附加到后台进程。 断点将命中,你可以逐步执行更新代码逻辑。
后台任务完成后,可以从同一调试会话中的 Windows 开始菜单启动前台应用。 调试器将再次自动附加到前台进程,你可以单步执行应用的逻辑。
注意
Visual Studio 2015 用户:上述步骤适用于 Visual Studio 2017 或 Visual Studio 2019。 如果使用 Visual Studio 2015,则可以使用相同的方法来触发和测试 UpdateTask,但 Visual Studio 不会附加到它。 VS 2015 中的替代过程是设置 ApplicationTrigger,将 UpdateTask 设置为其入口点,并直接从前台应用触发执行。