使用 SDK 版本 10586 的进程内后台任务

Use in-process background tasks with SDK version 10586

我想通过后台任务扩展我当前的 UWP 应用程序。 in-process model 完全符合我的需要,因为我不需要对应用程序进行太多更改即可使用后台任务。但是,有一个问题。目前最低 SDK 版本设置为 10586,但进程内后台任务仅适用于 SDK 版本 14393 及更高版本。

通常我会使用 'normal' if 子句来检查使用 Windows.Foundation.Metadata.ApiInformation 命名空间是否支持该功能。不幸的是,由于我正在覆盖 OnBackgroundActivated 方法,所以这是不可能的。老实说,我不想放弃 10586 支持,至少现在不想。

有没有一种简单的方法可以在保持对 10586 的支持的同时注册进程内后台任务?

编辑:正如我在一条(现已删除的)评论中被问及的那样:不,我还没有在 build 10586 上执行应用程序,因为我的互联网连接速度太慢了。我在问,因为当我将目标版本设置为 10586 时 Visual Studio 不会构建应用程序。

您覆盖的 OnBackgroundActivated 方法不是这里的问题,因为在 10586 上它根本不会被调用。要在项目的属性中为两个版本创建项目,请像这样设置目标版本: Target versions in Applications tab

调用BackgroundExecutionManager.RequestAccessAsync();会引起一些麻烦。在 10586 上使用的此方法调用期望您在 Package.appxmanifest 中定义了一个 BackgroundTask,在您的情况下您不必定义它,因为根据 documentation 不需要它。因此,为了重用代码,请将您的方法注册进程内 BackgroundTask 更改为如下所示:

public static async Task<bool> RegisterInProcessBackgroundTask(string taskName, uint time = 30) {
    try {
        await BackgroundExecutionManager.RequestAccessAsync();

        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
        taskBuilder.Name = taskName;
        taskBuilder.SetTrigger(new TimeTrigger(time, false));
        BackgroundTaskRegistration registration = taskBuilder.Register();

        return true;
    } catch {
        return false;
    }
}

这将在 14393+ 和 return true 上工作,因为任务已成功注册,并且 return false 在捕获异常后因为该类型的任务不是支持 10586.