在 Windows 应用中使用后台任务
发布时间:2026-08-14 | 浏览:1
访问此页面需要授权。 可以尝试 登录 或 更改目录 。
访问此页面需要授权。 可以尝试 更改目录 。
使用 Windows 应用 SDK BackgroundTaskBuilder 的后台任务要求应用 用 MSIX 打包 。 对于在没有 MSIX 打包的情况下部署的WPF或Windows 窗体应用,请改用 Task 计划程序 或 .NET Worker Services 。
本文概述了如何使用后台任务,并介绍如何在 WinUI 3 或其他 MSIX 打包的应用(包括WPF和Windows 窗体)中创建新的后台任务。 有关将 UWP 应用与后台任务迁移到 WinUI 的信息,请参阅 Windows 应用 SDK Background 任务迁移策略 。
后台任务是在后台运行且没有用户界面的应用组件。 他们可以执行下载文件、同步数据、发送通知或更新磁贴等作。 它们可由各种事件触发,例如时间、系统更改、用户作或推送通知。 即使应用未处于运行状态,这些任务也会在相应的触发器发生时执行。
对于 UWP 和 WinUI 应用,后台任务的实现有所不同。 有关将 UWP 应用与后台任务迁移到 WinUI 的信息,请参阅 Windows 应用 SDK Background 任务迁移策略 。
任务计划程序 可帮助桌面应用实现 UWP 应用中 BackgroundTaskBuilder 提供的相同功能。 此处 提供了有关使用 TaskScheduler 实现的更多详细信息。
使用Windows 应用 SDK随附的 BackgroundTaskBuilder 类注册使用完全信任 COM 组件的后台任务。
以下示例演示如何使用 C++ 注册后台任务。 在 Windows 应用 SDK github 示例中,可以在 MainWindow.Xaml.cpp
以下示例演示如何使用 C# 注册后台任务。 在 Windows 应用 SDK github 示例中,可以在 MainWindow.Xaml.cpp 中看到此注册代码。
请注意,对 SetEntryPointClsid 方法的调用需要一个参数,即实现 IBackgroundTask 的应用定义类的 GUID。 本文后面的 实现 IBackgroundTask 部分将讨论此接口。
注册后台任务时,请使用以下最佳做法。
在注册后台任务之前调用 BackgroundExecutionManager.RequestAccessAsync 。
在注册后台任务之前调用 BackgroundExecutionManager.RequestAccessAsync 。
不要多次注册后台任务。 在注册后台任务之前,请验证任务是否已注册,或者如在 Windows 应用程序 SDK 示例中所示,先注销所有后台任务,然后重新注册这些任务。 使用 BackgroundTaskRegistration 类查询现有后台任务。
不要多次注册后台任务。 在注册后台任务之前,请验证任务是否已注册,或者如在 Windows 应用程序 SDK 示例中所示,先注销所有后台任务,然后重新注册这些任务。 使用 BackgroundTaskRegistration 类查询现有后台任务。
使用 BackgroundTaskBuilder.Name 属性为后台任务指定有意义的名称,以简化调试和维护。
使用 BackgroundTaskBuilder.Name 属性为后台任务指定有意义的名称,以简化调试和维护。
实现 IBackgroundTask
IBackgroundTask 是一个接口,它公开一个方法 ,即运行 ,在调用后台任务时执行。 使用后台任务的应用必须包含实现 IBackgroundTask 的类。
以下示例演示如何使用 C++ 实现 IBackgroundTask 。 在 Windows 应用 SDK github 示例中,可以在 BackgroundTask.cpp 中看到此注册代码。
以下示例演示如何使用 C# 实现 IBackgroundTask 。 在 Windows 应用 SDK github 示例中,可以在 BackgroundTask.cpp 中看到此注册代码。
实现 IBackgroundTask 的最佳做法
实现 IBackgroundTask 时,请使用以下最佳做法。
如果背景任务将执行异步操作,则通过对传递到 Run 的 ITaskInstance 对象调用 GetDeferral 来获取延迟对象。 这样可以防止后台任务主机 backgroundtaskhost.exe 在作完成之前过早终止。 完成所有异步任务后,释放延期对象。
尽量保持任务轻量化。 长时间运行的任务可能由系统终止,不建议这样做。
使用日志记录捕获执行详细信息进行故障排除。
有关实现后台任务的更多最佳做法,请参阅 后台任务指南 。
在应用清单中声明后台任务应用扩展
必须在应用的 Package.appxmanifest 文件中声明应用扩展,以便在安装应用时向系统注册后台任务,并提供系统启动后台任务所需的信息。
必须将具有类别 windows.backgroundTasks 的 扩展添加到应用清单,以便在安装应用时成功注册后台任务。 C# 应用必须指定 EntryPoint 属性值“Microsoft.Windows。ApplicationModel.Background.UniversalBGTask.Task”。 对于 C++ 应用,通过将 WindowsAppSDKBackgroundTask 设置为 project 文件中的 true ,自动添加此功能。
还必须声明一个 com:Extension ,其类别值为“windows.comServer”。 必须在 com:ExeServer 元素中指定 LaunchAndActivationPermission 属性,以显式授予 backgroundtaskhost.exe 调用 COM 类的进程权限。 有关此字符串的格式的信息,请参阅 安全描述符字符串格式 。
请确保在 com:Class 元素中指定的类 ID 与 IBackgroundTask 实现的类 ID 匹配。
以下示例演示应用程序清单文件中应用程序扩展声明的语法,使系统能够发现和启动后台任务。 若要查看github上后台任务的完整应用清单文件,请参阅 Package.appxmanifest 。
为后台任务注册 COM 服务器
注册 COM 服务器可确保系统在 CoCreateInstance 调用时知道如何实例化背景任务类。 您必须通过调用 CoRegisterClassObject 为后台任务注册 COM 类工厂,否则 COM 激活将失败。
C++ 中的 COM 服务器注册
以下示例显示了一个 C++ 帮助程序函数 RegisterBackgroundTaskFactory ,该函数为实现 IBackgroundTask 的 类注册类工厂。 在此示例中,此类称为 BackgroundTask 。 在帮助程序类的析构函数中, 调用 CoRevokeClassObject 来撤销类工厂注册。
可以在文件 RegisterForCOM.cpp 的示例存储库中看到此帮助程序类。
对于 C++ 中的进程内服务器注册,请调用辅助类,通过在 Application.OnLaunched 方法中注册类工厂。 请参阅 App.xaml.cpp 示例存储库中的辅助方法的调用。
对于进程外后台任务,必须在启动过程中完成 COM 服务器注册。 可以在 App.xaml.cpp 中看到对帮助程序类的调用。
C# 中的 COM 服务器注册
下面的示例演示了一个 C# 帮助程序函数 CreateInstance ,该函数为实现 IBackgroundTask 的类注册类工厂。 在此示例中,此类称为 BackgroundTask 。 帮助程序类使用 LibraryImportAttribute 从 C# 访问 COM 注册方法。 有关详细信息,请参阅 平台调用的源生成 。 可以在 ComServer.cs 的示例存储库中看到帮助程序类的实现。
对于 C# 中的进程内后台任务,COM 注册是在应用程序启动时在 Application 对象的构造函数中进行的。 可以在 App.xaml.cs 的示例存储库中看到对帮助程序方法的调用。
对于 C# 中的进程外任务,必须在应用程序启动时执行 COM 注册。 要做到这一点,您必须通过更新应用程序的项目文件来禁用默认的 XAML 生成的 Main 入口点。
在默认project模板中,编译器自动生成 Main 方法入口点。 此示例将禁用 Main 的自动生成,以便可以在启动时运行必要的激活代码。
在 解决方案资源管理器 中,右键单击project图标,然后选择“编辑Project文件”。
在 PropertyGroup 元素中,添加以下子元素以禁用自动生成的主函数。
您可以在示例存储库的 Program.cs 文件中看到调用帮助类来注册 COM 类。
Windows developer
想要尝试使用 Ask Learn 阐明或指导你完成本主题?
Last updated on 2026-04-09