使用 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.
我想通过后台任务扩展我当前的 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.