Запуск фоновой задачи по таймеру

Узнайте, как запланировать однократное выполнение фоновой задачи или периодически запускать фоновую задачу с помощью элемента TimeTrigger.

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

В разделе предполагается, что у вас есть фоновая задача, которая должна выполняться периодически или в определенное время. Если у вас еще нет в фоновом режиме, это пример фоновой задачи в BackgroundActivity.cs. Или же выполните шаги из раздела Создание и регистрация фоновой задачи, выполняемой в процессе или Создание и регистрация фоновой задачи, выполняемой вне процесса для создания задачи.

Создание триггера времени

Создайте новый TimeTrigger. Второй параметр OneShot указывает, будет ли фоновая задача выполняться однократно или периодически. Если OneShot имеет значение True, первый параметр (FreshnessTime) задает число минут ожидания перед планированием фоновой задачи. Если OneShot имеет значение False, частоту выполнения фоновой задачи определяет FreshnessTime.

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

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

Комментарии

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

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