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

В темах этого раздела показано, как обеспечить выполнение облегченного кода в фоновом режиме в ответ на триггеры. Фоновые задачи можно использовать для предоставления функциональных возможностей, когда приложение приостановлено или не выполняется. Фоновые задачи также можно использовать для приложений, обеспечивающих общение в реальном времени, например компьютерной телефонии, почты и обмена мгновенными сообщениями.

Воспроизведение мультимедиа в фоновом режиме

Начиная c Windows 10 версии 1607, воспроизведение звука в фоновом режиме стало значительно проще. См. дополнительные сведения в разделе Воспроизведение мультимедиа в фоновом режиме.

Фоновые задачи внутри и вне процесса

Существует два подхода к реализации фоновых задач.

  • В процессе: приложение и его фоновый процесс запускаются в одном и том же процессе
  • Вне процесса: приложение и фоновый процесс выполняются в отдельных процессах.

Поддержка выполняемых в процессе фоновых задач появилась в Windows 10 версии 1607, чтобы упростить написание фоновых задач. Однако вы по-прежнему можете создавать фоновые задачи вне процесса. См. рекомендации о том, когда записывать фоновую задачу в процессе и вне его, в разделе Рекомендации по фоновым задачам.

Фоновые задачи, которые выполняются вне процесса, являются более устойчивыми, поскольку фоновый процесс не может прекратить работу приложения, если что-то пойдет не так. Но устойчивость достигается за счет большей сложности при управлении межпроцессным взаимодействием между приложением и фоновой задачей.

Выполняемые вне процесса фоновые задачи реализуются как облегченные классы, которые реализуют интерфейс IBackgroundTask, который ОС выполняет в виде отдельного процесса (backgroundtaskhost.exe). Зарегистрируйте фоновую задачу с помощью класса BackgroundTaskBuilder. Имя класса используется для указания точки входа при регистрации фоновой задачи.

В Windows 10 версии 1607 можно включить фоновую активность, не создавая фоновой задачи. Вместо этого код фоновой задачи можно выполнять прямо внутри процесса приложения переднего плана.

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

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

Совет

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

Фоновые задачи для системных событий

Ваше приложение может отвечать на события, создаваемые системой, регистрируя фоновую задачу с помощью класса SystemTrigger. Оно может использовать любые из нижеперечисленных триггеров системных событий (определенных в SystemTriggerType).

Имя триггера Описание
InternetAvailable Появляется доступ к Интернету.
NetworkStateChange Происходит изменение сети, такое как изменение стоимости или подключения.
OnlineIdConnectedStateChange ИД интернет-службы, связанный с изменением учетной записи.
SmsReceived Установленным устройством с высокоскоростным мобильным подключением получено новое SMS-сообщение.
TimeZoneChange В устройстве изменяется часовой пояс (например, когда система переводит часы на летнее время).

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

Условия для фоновых задач

Добавив условие, вы сможете контролировать выполнение фоновой задачи даже после ее запуска. При активации фоновая задача не будет выполняться, пока не будут соблюдены все условия. Можно использовать следующие условия (представленные перечислением SystemConditionType).

Имя условия Описание
InternetAvailable Интернет должен быть доступен.
InternetNotAvailable Интернет должен быть недоступен.
SessionConnected Сеанс должен быть подключен.
SessionDisconnected Сеанс должен быть отключен.
UserNotPresent Пользователь должен отсутствовать.
UserPresent Пользователь должен присутствовать.

Добавьте условие InternetAvailable в фоновую задачу BackgroundTaskBuilder.AddCondition, чтобы задержать активацию фоновой задачи до запуска сетевого стека. Это условие экономит энергию, так как фоновая задача не будет выполняться, пока сеть недоступна. Это условие не поддерживает активацию в режиме реального времени.

Если ваша фоновая задача требует подключения к сети, задайте условие IsNetworkRequested, чтобы обеспечить сохранность подключения к сети, пока выполняется фоновая задача. Это указывает инфраструктуре фоновых задач на необходимость поддержания соединения во время выполнения задачи, даже если устройство переходит в режим ожидания с подключением. Если ваша фоновая задача не задает условие IsNetworkRequested согласно приведенным здесь указаниям, эта фоновая задача не сможет получить доступ к сети в режиме ожидания с подключением (например, при выключении экрана телефона). Дополнительные сведения об условиях выполнения фоновых задач см. в разделе Указание условий выполнения фоновой задачи.

Требования к манифесту приложения

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

Фоновые задачи

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

Триггер в реальном времени Описание
Канал управления Фоновые задачи могут поддерживать подключение и получать сообщения по каналу управления, используя класс ControlChannelTrigger. Если приложение ожидает передачи данных из сокета, можно использовать посредник сокетов вместо ControlChannelTrigger. Узнать больше об использовании посредника сокетов можно в разделе SocketActivityTrigger. ControlChannelTrigger не поддерживается в Windows Phone.
Таймер Фоновые задачи могут выполняться через каждые 15 минут, и их можно настроить на выполнение в определенное время, используя TimeTrigger. См. также: Запуск фоновой задачи по таймеру.
Push-уведомление Фоновые задачи реагируют на PushNotificationTrigger, чтобы получать необработанные push-уведомления.

Примечание  

Универсальные приложения для Windows должны вызвать RequestAccessAsync перед регистрацией любых типов фоновых триггеров.

Чтобы универсальное приложение для Windows продолжало правильно работать после выпуска обновления, необходимо вызвать метод RemoveAccess, а затем — метод RequestAccessAsync при запуске приложения после обновления. Дополнительные сведения см. в разделе Руководство по фоновым задачам.

Ограничения на количество экземпляров триггера: существуют ограничения на количество экземпляров некоторых триггеров, которые может зарегистрировать приложение. Приложение может зарегистрировать ApplicationTrigger, MediaProcessingTrigger и DeviceUseTrigger только один раз для каждого экземпляра приложения. Если приложение переходит за этот предел, регистрация вызовет исключение.

Триггеры системных событий

Перечисление SystemTriggerType представляет следующие триггеры системных событий:

Имя триггера Описание
UserPresent Фоновая задача запускается в присутствии пользователя.
UserAway Фоновая задача запускается в отсутствие пользователя.
ControlChannelReset Фоновая задача запускается при сбросе канала управления.
SessionConnected Фоновая задача запускается при подключенном сеансе.

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

Имя триггера Описание
LockScreenApplicationAdded На экран блокировки добавляется плитка приложения.
LockScreenApplicationRemoved С экрана блокировки удаляется плитка приложения.

 

Ограничения на ресурсы фоновых задач

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

Фоновые задачи ограничены 30 секундами физического времени.

Ограничения на использование памяти

Из-за ограничений на ресурсы для устройств с небольшим объемом памяти фоновые задачи приложений могут иметь ограничение на использование памяти, определяющее максимальный объем памяти, который может использовать фоновая задача. Если фоновая задача попытается выполнить операцию, которая превысит это ограничение, операция завершится ошибкой и может вызвать исключение "Недостаточно памяти", которое задача сможет обработать. Если задача не обрабатывает исключение "Недостаточно памяти" или тип операции не вызывает такое исключение, задача будет немедленно остановлена.

Вы можете использовать API MemoryManager, чтобы запросить текущий объем и ограничение используемой памяти, а также чтобы отслеживать использование памяти фоновой задачей.

Ограничения «на устройство» для приложений с фоновыми задачами для устройств с небольшим объемом памяти

Для устройств с малым объемом памяти существует ограничение на количество приложений, которые устанавливаются на устройство и используют фоновые задачи одновременно. Если превысить это количество, произойдет сбой вызова RequestAccessAsync, необходимого для регистрации всех фоновых задач.

Экономия заряда аккумулятора

Если не добавить приложение в список исключений, чтобы оно могло продолжить выполнение фоновых задач и получать push-уведомления при включенной экономии заряда, фоновые задачи не будут запускаться, если устройство не подключено к внешнему источнику питания и заряд аккумулятора становится меньше определенного уровня. Но это не повлияет на возможность регистрации фоновых задач.

Однако для корпоративных приложений и приложений, которые не будут опубликованы в Microsoft Store, см. статью Запуск в фоновом режиме на неопределенный срок , чтобы узнать, как использовать возможности для запуска фоновой задачи или расширенного сеанса выполнения в фоновом режиме на неопределенный срок.

Ресурс фоновой задачи гарантирует связь в реальном времени

Чтобы исключить помехи для функций связи в реальном времени из-за выделения квот ресурсов, каждая выполняющаяся фоновая задача, использующая ControlChannelTrigger и PushNotificationTrigger, получает гарантированные объемы ресурсов ЦП. Квоты ресурсов остаются такими, как упоминалось выше, и сохраняются постоянными для этих фоновых задач.

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

Триггер обслуживания

Задачи обслуживания выполняются только в том случае, если устройство подключено к сети переменного тока. См. также: Использование триггера обслуживания.

Фоновые задачи для датчиков и устройств

Ваше приложение может получать доступ к датчикам и периферийным устройствам из фоновой задачи с помощью класса DeviceUseTrigger. Этот триггер можно использовать для продолжительных операций, таких как синхронизация данных или мониторинг. В отличие от задач для системных событий задачу DeviceUseTrigger можно инициировать только во время работы приложения на переднем плане, и для нее невозможно установить какие-либо условия.

Важно!

Триггеры DeviceUseTrigger и DeviceServicingTrigger невозможно использовать с фоновыми задачами, выполняемыми внутри процесса.

Некоторые критические операции с устройством, например длительные обновления встроенного ПО, не могут выполняться с помощью класса DeviceUseTrigger. Такие операции могут выполняться только на компьютере и только привилегированным приложением, которое использует DeviceServicingTrigger. Привилегированным называется приложение, которому изготовитель устройства разрешил выполнять эти операции. Метаданные устройства позволяют указать, какое приложение (при его наличии) было назначено в качестве привилегированного приложения на устройстве. Дополнительные сведения см. в статье Синхронизация и обновление устройств для приложений Microsoft Store.

Управление фоновыми задачами

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

Обработка отмененной фоновой задачи
Отслеживание хода выполнения и завершения фоновых задач

Проверьте регистрацию вашей фоновой задачи во время запуска приложения. Убедитесь, что разгруппированные фоновые задачи вашего приложения присутствуют в BackgroundTaskBuilder.AllTasks. Повторно зарегистрируйте те, которые не отображаются. Отмените регистрацию всех задач, которые больше не нужны. Это гарантирует, что все регистрации фоновых задач являются актуальными при каждом запуске приложения.

Концептуальное руководство по многозадачности в Windows 10

Руководство по фоновым задачам