Поделиться через


Выполнение фоновой задачи на таймере

Узнайте, как использовать TimeTrigger для планирования однократной фоновой задачи или выполнения периодической фоновой задачи.

См. сценарий4 в примере фоновой активации, чтобы увидеть пример реализации фоновой задачи, активируемой по расписанию, как это описано в этой теме.

В этом разделе предполагается, что у вас есть фоновая задача, которая должна периодически выполняться или в определенное время. Если у вас еще нет фоновой задачи, в 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 минут, начиная от 15 до 30 минут с момента регистрации. Если задано значение 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 управления памятью , чтобы узнать, сколько памяти используется фоновая задача. Чем больше памяти используется фоновая задача, тем сложнее, чтобы операционная система выполняла ее, когда другое приложение находится на переднем плане. Пользователь в конечном счете контролирует все фоновые действия, которые ваше приложение может выполнять и имеет видимость о влиянии вашего приложения на использование батареи.
  • Время работы ЦП: фоновые задачи ограничиваются объемом использования времени настенных часов, который они получают на основе типа триггера.

См. раздел Поддержка вашего приложения с помощью фоновых задач, чтобы узнать об ограничениях ресурсов, применяемых к фоновым задачам.

Замечания

Начиная с Windows 10, пользователю больше не нужно добавлять приложение на экран блокировки, чтобы использовать фоновые задачи.

Фоновая задача будет выполняться только с помощью TimeTrigger, если сначала вы вызвали RequestAccessAsync.