Руководство по работе с фоновыми задачамиGuidelines for background tasks

Убедитесь, что ваше приложение отвечает требованиям, необходимым для выполнения фоновых задач.Ensure your app meets the requirements for running background tasks.

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

Рекомендуем использовать следующее руководство при разработке фоновой задачи и перед публикацией вашего приложения.Consider the following guidance when developing your background task, and before publishing your app.

Если фоновая задача используется для воспроизведения мультимедиа в фоновом режиме, см. раздел Воспроизведение мультимедиа в фоновом режиме, где приведены сведения об улучшениях в Windows 10 версии 1607, которые значительно упрощают работу.If you use a background task to play media in the background, see Play media in the background for information about improvements in Windows 10, version 1607, that make it much easier.

Фоновые задачи, выполняемые внутри или вне процесса: в Windows 10 версии 1607 появились фоновые задачи, выполняемые внутри процесса, которые позволяют выполнять фоновый код в том же процессе, что и основное приложение.In-process versus out-of-process background tasks: Windows 10, version 1607, introduced in-process background tasks which allows you to run background code in the same process as your foreground app. При выборе фоновых задач внутри или вне процесса необходимо учитывать следующие факторы:Consider the following factors when deciding whether to have in-process vs. out-of-process background tasks:

ОценкаConsideration ВлияниеImpact
УстойчивостьResilience Если фоновый процесс выполняется в другом процессе, сбой в фоновом процессе не повлияет на работу приложения переднего плана.If your background process is running in another process, a crash in your background process won't take down your foreground application. Кроме того, фоновую операцию можно завершить (даже из приложения), если время ее выполнения выходит за заданные пределы.Also, background activity can be terminated, even within your app, if it runs past execution time limits. Выделение фоновой работы в задачу, отдельную от приложения переднего плана, может быть лучшим выбором, когда не требуется обмениваться данными между процессом переднего плана и фоновым процессом (поскольку отсутствие необходимости во взаимодействии между процессами является одним из основных преимуществ фоновых задач, выполняющихся внутри процесса).Separating background work into a task separate from the foreground app may be a better choice when it isn't necessary for the foreground and background processes to communicate with each other (since one of the main advantages of in-process background tasks are that they remove the need for inter-process communication).
ПростотаSimplicity Фоновые задачи, выполняющиеся внутри процесса, не требуют взаимодействия между процессами и проще в разработке.In-process background tasks don't require cross-process communication and are less complex to write.
Доступные триггерыAvailable triggers Фоновые задачи в процессе не поддерживают следующие триггеры: девицеусетригжер, девицесервиЦингтригжер и иотстартуптаск.In-process background tasks don't support the following triggers: DeviceUseTrigger, DeviceServicingTrigger and IoTStartupTask.
VoIPVoIP Фоновые задачи внутри процесса не поддерживают активации фоновой задачи VoIP в приложении.In-process background tasks don't support activating a VoIP background task within your application.

Ограничения на количество экземпляров триггера: существуют ограничения на количество экземпляров некоторых триггеров, которые может зарегистрировать приложение.Limits on the number of trigger instances: There are limits to how many instances of some triggers an app can register. Приложение может зарегистрировать триггеры ApplicationTrigger, MediaProcessingTrigger и DeviceUseTrigger только один раз на экземпляр приложения.An app can only register ApplicationTrigger, MediaProcessingTrigger and DeviceUseTrigger once per instance of the app. Если приложение переходит за этот предел, регистрация вызовет исключение.If an app goes over this limit, registration will throw an exception.

Квоты ЦП: фоновые задачи ограничены физическим временем использования, которое они получают в зависимости от типа триггера.CPU quotas: Background tasks are limited by the amount of wall-clock usage time they get based on trigger type. Большинство триггеров ограничены 30 секундами использования, хотя некоторые могут выполняться до 10 минут для завершения сложных задач.Most triggers are limited to 30 seconds of wall-clock usage, while some have the ability to run up to 10 minutes in order to complete intensive tasks. Фоновые задачи должны быть облегченными, чтобы экономить время работы батареи и обеспечивать удобную работу с приложениями переднего плана.Background tasks should be lightweight to save battery life and provide a better user experience for foreground apps. Сведения об ограничениях ресурсов для фоновых задач см. в статье Поддержка приложения с помощью фоновых задач.See Support your app with background tasks for the resource constraints applied to background tasks.

Управление фоновыми задачами: ваше приложение должно получать список зарегистрированных фоновых задач, регистрировать обработчики выполнения и завершения и обрабатывать эти события соответствующим образом.Manage background tasks: Your app should get a list of registered background tasks, register for progress and completion handlers, and handle those events appropriately. Классы фоновой задачи должны сообщать о выполнении, отмене и завершении.Your background task classes should report progress, cancellation, and completion. Подробнее об этом см. в статьях Обработка отмененной фоновой задачи и Отслеживание хода выполнения и завершения фоновых задач.For more info see Handle a cancelled background task, and Monitor background task progress and completion.

Использование BackgroundTaskDeferral: если класс вашей фоновой задачи выполняет асинхронный код, обязательно используйте отсрочки.Use BackgroundTaskDeferral: If your background task class runs asynchronous code, make sure to use deferrals. В противном случае фоновая задача может завершиться преждевременно, когда метод Run возвращает (или метод онбаккграундактиватед в случае фоновых задач).Otherwise your background task may be terminated prematurely when the Run method returns (or the OnBackgroundActivated method in the case of in-process background tasks). Дополнительные сведения см. в разделе Создание и регистрация фоновой задачи вне процесса.For more information, see Create and register an out-of-process background task.

Можно также запросить одну отсрочку и использовать async/await, чтобы завершить асинхронные вызовы метода.Alternatively, request one deferral, and use async/await to complete asynchronous method calls. Закройте отсрочку после вызовов метода await.Close the deferral after the await method calls.

Обновление манифеста приложения: для фоновых задач, которые выполняются вне процесса, объявите каждую фоновую задачу в манифесте приложения вместе с типом триггеров, который используется с этой задачей.Update the app manifest: For background tasks that run out-of-process, declare each background task in the application manifest, along with the type of triggers it is used with. В противном случае ваше приложение не сможет зарегистрировать фоновую задачу во время выполнения.Otherwise your app will not be able to register the background task at runtime.

При наличии нескольких фоновых задач определите, следует ли их выполнять в одном хост-процессе или их нужно разделить на разные хост-процессы.If you have multiple background tasks, consider whether they should run in the same host process or be separated into different host processes. Если вы считаете, что сбой в одной фоновой задаче может вывести из строя другие фоновые задачи, поместите их в разных хост-процессах.Put them in separate host processes if you are concerned that a failure in one background task could bring down other background tasks. Используйте запись Группа ресурсов в конструкторе манифеста, чтобы разместить фоновые задачи в различных хост-процессах.Use the Resource group entry in the manifest designer to group background tasks into different host processes.

Чтобы настроить группу ресурсов, откройте конструктор Package.appxmanifest, выберите Объявления и добавьте объявление службы приложения:To set the Resource group, open the Package.appxmanifest designer, choose Declarations, and add an App Service declaration:

Настройка группы ресурсов

Дополнительные сведения о настройке группы ресурсов см. в справочнике по схеме приложений.See the application schema reference for more information about the resource group setting.

Фоновые задачи, которые выполняются в том же процессе, что и приложение переднего плана, не требуется объявлять в манифесте приложения.Background tasks that run in the same process as the foreground app do not need to declare themselves in the application manifest. Дополнительные сведения об объявлении в манифесте фоновых задач, которые выполняются вне процесса, см. в разделе Объявление фоновых задач в манифесте приложения.For more information about declaring background tasks that run out-of-process in the manifest, see Declare background tasks in the application manifest.

Подготовка к обновлениям приложений: если ваше приложение будет обновляться, создайте и зарегистрируйте фоновую задачу ServicingComplete (см. SystemTriggerType), чтобы отменить регистрацию фоновых задач для предыдущей версии приложения и зарегистрировать фоновые задачи для новой версии.Prepare for app updates: If your app will be updated, create and register a ServicingComplete background task (see SystemTriggerType) to unregister background tasks for the previous version of the app, and register the background tasks for the new version. Это также подходящий момент для выполнения обновлений приложения, которые могут быть необходимы вне контекста выполнения на переднем плане.This is also an appropriate time to perform app updates that may be necessary outside the context of running in the foreground.

Запрос на выполнение фоновых задач:Request to execute background tasks:

Важно! Начиная с Windows 10, для выполнения фоновых задач не требуется, чтобы приложение обязательно располагалось на экране блокировки.Important Starting in Windows 10, apps are no longer required to be on the lock screen as a prerequisite to run background tasks.

Приложения универсальной платформы Windows (UWP) могут выполнять все поддерживаемые типы задач без закрепления на экране блокировки.Universal Windows Platform (UWP) apps can run all supported task types without being pinned to the lock screen. Однако приложения должны вызвать жетакцессстате и убедиться, что приложение не запрещает выполнение в фоновом режиме.However, apps must call GetAccessState and check that the app is not denied from running in the background. Убедитесь, что жетакцессстатус не возвращает одно из запрещенных перечислений баккграундакцессстатус .Ensure that GetAccessStatus does not return one of the denied BackgroundAccessStatus enums. Например, этот метод возвратит баккграундакцессстатус. дениедбюсер , если пользователь явно отклонил разрешения фоновой задачи для приложения в параметрах устройства.For example, this method will return BackgroundAccessStatus.DeniedByUser if the user has explicitly denied background task permissions for your app in the device's settings.

Если приложению запрещено работать в фоновом режиме, приложение должно вызвать рекуестакцессасинк и убедиться, что ответ не отклоняется перед регистрацией фоновых задач.If your app is denied from running in the background, your app should call RequestAccessAsync and ensure the response is not denied before registering background tasks.

Дополнительные сведения о доступных пользователю настройках фоновых задач и экономии заряда см. в разделе Оптимизация фоновой активности.For more information on user choice around background activity and Battery Saver, see Optimize Background Activity.

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

Относится к фоновым задачам, которые выполняются как внутри, так и вне процессаApplies to both in-process and out-of-process background tasks

  • Сопоставьте вашу фоновую задачу с правильным триггером.Associate your background task with the correct trigger.
  • Добавьте условия, которые поспособствуют успешному выполнению вашей фоновой задачи.Add conditions to help ensure your background task runs successfully.
  • Обработайте выполнение, завершение и отмену фоновой задачи.Handle background task progress, completion, and cancellation.
  • Повторно зарегистрируйте свои фоновые задачи во время запуска приложения.Re-register your background tasks during app launch. Это гарантирует их регистрацию во время первого запуска.This ensures that they are registered the first time the app is launched. Это позволяет узнать, отключил ли пользователь возможности фонового выполнения приложения (в случае сбоя регистрации).It also provides a way to detect whether the user has disabled your app's background execution capabilities (in the event registration fails).
  • Проверьте наличие ошибок регистрации фоновых задач.Check for background task registration errors. При необходимости попытайтесь зарегистрировать фоновую задачу снова с другими значениями параметров.If appropriate, attempt to register the background task again with different parameter values.
  • Если устройству не хватает памяти, фоновые задачи могут быть завершены для всех семейств устройств (за исключением настольных компьютеров).For all device families except desktop, if the device becomes low on memory, background tasks may be terminated. Если исключение "Недостаточно памяти" не отображается или приложение не обрабатывает его, то фоновая задача будет завершена без предупреждения и без вызова события OnCanceled.If an out of memory exception is not surfaced, or the app does not handle it, then the background task will be terminated without warning and without raising the OnCanceled event. Это позволяет не прерывать работу пользователя с активным приложением.This helps to ensure the user experience of the app in the foreground. Ваша фоновая задача должна поддерживать этот сценарий.Your background task should be designed to handle this scenario.

Относится только к фоновым задачам вне процессаApplies only to out-of-process background tasks

  • Создание фоновой задачи в компоненте среда выполнения Windows.Create your background task in a Windows Runtime component.
  • Не отображайте никакие элементы пользовательского интерфейса, кроме уведомлений, плиток и обновлений индикаторов событий из кода фоновой задачи.Do not display UI other than toasts, tiles, and badge updates from the background task.
  • В методе Run запросите отсрочки для каждого асинхронного вызова метода и закройте их после завершения метода.In the Run method, request deferrals for each asynchronous method call, and close them when the method is done. Можно также использовать одну отсрочку вместе с async/await.Or, use one deferral with async/await.
  • Используйте постоянное хранилище для совместного использования данных фоновой задачей и приложением.Use persistent storage to share data between the background task and the app.
  • Объявите каждую фоновую задачу в манифесте приложения вместе с типом триггеров, если он используется с задачей.Declare each background task in the application manifest, along with the type of triggers it is used with. Убедитесь, что точка входа и типы триггеров указаны правильно.Make sure the entry point and trigger types are correct.
  • Не указывайте в манифесте элемент Executable за исключением случая, когда используется триггер, который должен выполняться в одном контексте с приложением (например, ControlChannelTrigger).Do not specify an Executable element in the manifest unless you are using a trigger that should be run in the same context as the app (such as the ControlChannelTrigger).

Относится только к фоновым задачам внутри процессаApplies only to in-process background tasks

  • При отмене задачи убедитесь, что существует обработчик события BackgroundActivated; в противном случае будет прервано выполнение всего процесса.When cancelling a task, ensure that the BackgroundActivated event handler exits before the cancellation occurs or the whole process will be terminated.
  • Пишите кратковременные фоновые задачи.Write background tasks that are short-lived. Большинство фоновых задач ограничено 30 секундами использования на стене.Most background tasks are limited to 30 seconds of wall-clock usage.

Чего следует избегатьThings to avoid

  • Сократите использование межпроцессного взаимодействия через COM или RPC.Minimize the use of inter-process communication via COM or RPC.
  • Процесс, с которым вы пытаетесь связаться, может не находиться в состоянии выполнения, что может привести к зависанию.The process you are trying to communicate with may not be in a running state which can result in a hang.
  • Значительное количество времени может быть затрачено на обработку межпроцессного обмена данными, и оно будет считаться временем, выделенным для выполнения фоновой задачи.A significant amount of time could be spent facilitating cross process communication, and will count against the time allotted to run your background task.
  • Не используйте взаимодействие с пользователем в фоновых задачах.Do not rely on user interaction in background tasks.