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


Рекомендации по фоновым задачам

Убедитесь, что приложение соответствует требованиям для выполнения фоновых задач.

Руководство по фоновой задаче

При разработке фоновой задачи и перед публикацией приложения рассмотрите следующее руководство.

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

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

Фактор Воздействие
Устойчивость Если фоновый процесс выполняется в другом процессе, сбой в фоновом процессе не приведет к сбою приложения переднего плана. Кроме того, фоновые действия можно завершить даже в приложении, если оно выполняется в прошлом времени выполнения. Разделение фоновой работы на задачу отдельно от приложения переднего плана может быть лучшим выбором, если не требуется для переднего плана и фоновых процессов для взаимодействия друг с другом (так как одно из основных преимуществ фоновых задач внутри процесса заключается в том, что они удаляют необходимость межпроцессного взаимодействия).
Простота Фоновые задачи внутри процесса не требуют межпроцессного взаимодействия и менее сложны для записи.
Доступные триггеры Фоновые задачи в процессе не поддерживают следующие триггеры: DeviceUseTrigger, DeviceServicingTrigger и IoTStartupTask.
VoIP Фоновые задачи в процессе не поддерживают активацию фоновой задачи VoIP в приложении.

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

Квоты ЦП: фоновые задачи ограничены объемом времени использования часов, которые они получают на основе типа триггера. Большинство триггеров ограничены 30 секундами использования настенных часов, в то время как некоторые имеют возможность выполнять до 10 минут, чтобы выполнить интенсивные задачи. Фоновые задачи должны быть упрощенными для экономии заряда батареи и обеспечить лучший пользовательский интерфейс для приложений переднего плана. См. статью "Поддержка приложения с фоновыми задачами" для ограничений ресурсов, применяемых к фоновым задачам .

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

Используйте BackgroundTaskDeferral: если фоновый класс задач запускает асинхронный код, обязательно используйте отсрочки. В противном случае фоновая задача может быть прекращена преждевременно, когда метод Run возвращает (или метод OnBackgroundActivated в случае фоновых задач в процессе). Дополнительные сведения см. в статье "Создание и регистрация фоновой задачи вне процесса".

Кроме того, запросите одну отсрочку и используйте async/await для выполнения асинхронных вызовов методов. Закройте отсрочку после вызовов метода await .

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

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

Чтобы задать группу ресурсов, откройте конструктор Package.appxmanifest, выберите объявления и добавьте объявление Служба приложений:

Параметр группы ресурсов

Дополнительные сведения о параметрах группы ресурсов см. в справочнике по схеме приложения.

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

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

Запрос на выполнение фоновых задач:

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

приложения универсальная платформа Windows (UWP) могут запускать все поддерживаемые типы задач без закрепления на экране блокировки. Однако приложения должны вызывать GetAccessState и проверять, что приложение не отказано в работе в фоновом режиме. Убедитесь, что GetAccessStatus не возвращает одно из запрещенных перечислений BackgroundAccessStatus. Например, этот метод вернет BackgroundAccessStatus.DeniedByUser , если пользователь явно отказал в разрешениях фоновой задачи для приложения в параметрах устройства.

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

Дополнительные сведения о выборе пользователя по фоновому действию и экономии батареи см. в разделе "Оптимизация фонового действия".

Контрольный список фоновых задач

Применяется как к фоновым задачам внутри процесса, так и к внепроцессным фоновым задачам

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

Применяется только к внепроцессным фоновым задачам

  • Создайте фоновую задачу в компоненте среда выполнения Windows.
  • Не отображайте пользовательский интерфейс, отличный от точек, плиток и обновлений значков из фоновой задачи.
  • В методе Run запросите отсрочки для каждого асинхронного вызова метода и закройте их после завершения метода. Или используйте одну отсрочку с асинхронным или ожиданием.
  • Используйте постоянное хранилище для совместного использования данных между фоновой задачей и приложением.
  • Объявите каждую фоновую задачу в манифесте приложения, а также тип триггеров, с которыми он используется. Убедитесь, что точка входа и типы триггеров верны.
  • Не указывайте в манифесте элемент исполняемого файла, если не используется триггер, который должен выполняться в том же контексте, что и приложение (например, ControlChannelTrigger).

Применяется только к фоновым задачам внутри процесса

  • При отмене задачи убедитесь, что BackgroundActivated обработчик событий завершает работу до завершения отмены или весь процесс будет завершен.
  • Напишите фоновые задачи, которые являются короткими. Большинство фоновых задач ограничены 30 секундами использования настенных часов.

Вещи, чтобы избежать

  • Свести к минимуму использование взаимодействия между процессами через COM или RPC.
  • Процесс, с которым вы пытаетесь взаимодействовать, может не находиться в состоянии выполнения, что может привести к зависаю.
  • Значительное количество времени может быть потрачено на упрощение межпроцессного взаимодействия и будет учитывать время, выделенное для выполнения фоновой задачи.
  • Не полагаться на взаимодействие пользователей в фоновых задачах.