在计时器上运行后台任务

了解如何使用 TimeTrigger 计划一次性后台任务或运行定期后台任务。

请参阅 后台激活示例 中的 Scenario4,了解如何实现本主题中所述的时间触发的后台任务的示例。

本主题假定你有一个后台任务需要定期运行,或者在特定时间运行。 如果您尚未有后台任务,可以在 BackgroundActivity.cs找到一个示例后台任务。 或者,按照步骤 创建和注册进程内后台任务创建和注册进程外后台任务 来创建。

创建时间触发器

创建新的 TimeTrigger。 第二个参数 OneShot 指定后台任务是只运行一次还是定期运行。 如果 OneShot 设置为 true,则第一个参数(FreshnessTime)指定在计划后台任务之前需要等待的分钟数。 如果 OneShot 设置为 false,FreshnessTime 指定后台任务运行的频率。

面向桌面或移动设备系列的通用 Windows 平台(UWP)应用的内置计时器以 15 分钟的间隔运行后台任务。 (计时器以 15 分钟的间隔运行,使系统只需每隔 15 分钟唤醒一次即可唤醒请求 TimerTriggers 的应用,从而节省电源。

  • 如果 FreshnessTime 设置为 15 分钟,OneShot 为 true,则任务将在注册后 15 到 30 分钟之间开始运行一次。 如果设置为 25 分钟,OneShot 为 true,则任务将在注册后 25 到 40 分钟之间开始运行一次。

  • 如果将 FreshnessTime 设置为 15 分钟,并且 OneShot 为 false,则任务将在注册后的15到30分钟之间开始,每隔15分钟运行一次。 如果设置为 n 分钟,并且 OneShot 为 false,则任务将被计划为每隔 n 分钟运行一次,开始在注册后的 n 到 n + 15 分钟之间。

注释

如果将 FreshnessTime 设置为小于 15 分钟,则注册后台任务时会抛出异常。

例如,此触发器将导致后台任务每小时运行一次。

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(可选)添加条件

可以创建后台任务条件来控制任务何时运行。 条件可防止后台任务在满足条件之前运行。 有关详细信息,请参阅 设置运行后台任务的条件

在此示例中,条件设置为 UserPresent,这样一旦触发,任务仅在用户活动时运行。 有关可能条件的列表,请参阅 SystemConditionType

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

有关条件和后台触发器类型的更深入的信息,请参阅 通过后台任务支持您的应用程序

调用 RequestAccessAsync()

注册 ApplicationTrigger 后台任务之前,请调用 RequestAccessAsync 来确定用户允许的后台活动级别,因为该用户可能已禁用应用的后台活动。 有关用户可以控制后台活动设置的详细信息,请参阅 “优化后台活动 ”。

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

注册后台任务

通过调用后台任务注册函数注册后台任务。 有关注册后台任务的详细信息,并查看以下示例代码中 RegisterBackgroundTask() 方法的定义,请参阅 注册后台任务

重要

对于在与应用相同的进程中运行的后台任务,请不要设置 entryPoint。 对于在独立于应用的进程中运行的后台任务,请将 entryPoint 设置为命名空间、'.' 以及包含后台任务实现的类的名称。

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

后台任务注册参数在注册时会被验证。 如果任何注册参数无效,则返回错误。 确保应用程序能够有效处理后台任务注册失败的情况——如果在尝试注册任务后应用程序依赖于拥有有效的注册对象,那么它可能会崩溃。

管理您后台任务的资源

使用 BackgroundExecutionManager.RequestAccessAsync 确定用户是否已决定应限制你应用的后台活动。 请注意电池使用情况,并且仅在需要完成用户所需的操作时在后台运行。 有关用户可以控制后台活动设置的详细信息,请参阅 “优化后台活动 ”。

  • 内存:优化应用的内存和能量使用是确保操作系统允许后台任务运行的关键。 使用 内存管理 API 查看后台任务使用的内存量。 后台任务使用的内存越多,当另一个应用处于前台时,OS 就越难保持其运行。 用户最终可以控制应用可以执行的所有后台活动,并能够查看应用对电池使用的影响。
  • CPU 时间:后台任务的时钟使用时间受到触发器类型的限制。

有关应用于后台任务的资源约束,请参阅 使用后台任务支持您的应用

注解

从 Windows 10 开始,用户不再需要将应用添加到锁屏,以便利用后台任务。

如果首先调用 RequestAccessAsync,则后台任务将仅使用 TimeTrigger 运行。