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


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

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

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

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

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

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

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

В Windows 10 версии 1607 была реализована поддержка фонового фона для упрощения написания фоновых задач. Но вы по-прежнему можете записывать фоновые задачи вне процесса. Инструкции по фоновым задачам см. в разделе "Рекомендации по написанию внутрипроцессной и внепроцессной фоновой задачи".

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

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

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

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

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

Совет

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

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

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

Имя триггера Description
InternetAvailable Интернет становится доступным.
NetworkStateChange Изменение сети, например изменение стоимости или подключения.
OnlineIdConnectedStateChange Идентификатор сети, связанный с изменениями учетной записи.
SmsReceived Новое SMS-сообщение получает установленное мобильное широкополосное устройство.
TimeZoneChange Часовой пояс изменяется на устройстве (например, когда система настраивает часы для летнего времени).

Дополнительные сведения см. в статье "Реагирование на системные события с помощью фоновых задач".

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

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

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

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

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

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

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

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

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

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

Примечание  

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

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

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

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

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

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

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

Имя триггера Description
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

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