Diretrizes para tarefas em segundo planoGuidelines for background tasks

Verifique se seu aplicativo atende aos requisitos para executar tarefas em segundo plano.Ensure your app meets the requirements for running background tasks.

Diretrizes da tarefa em segundo planoBackground task guidance

Considere as diretrizes a seguir ao desenvolver a tarefa em segundo plano e antes de publicar o aplicativo.Consider the following guidance when developing your background task, and before publishing your app.

Se você usar uma tarefa em segundo plano para reproduzir mídia em segundo plano, consulte Reproduzir mídia em segundo plano para obter informações sobre os aprimoramentos no Windows 10, versão 1607, que tornam a tarefa mais fácil.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.

Tarefas em segundo plano dentro do processo versus fora do processo: o Windows 10, versão 1607, introduziu tarefas em segundo plano dentro do processo que permitem executar código em segundo plano no mesmo processo que o seu aplicativo em primeiro plano.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. Leve em consideração os seguintes fatores ao decidir se deseja ter tarefas em segundo plano dentro X fora do processo:Consider the following factors when deciding whether to have in-process vs. out-of-process background tasks:

ConsideraçãoConsideration ImpactoImpact
ResiliênciaResilience Se o seu processo em segundo plano está em execução em outro processo, uma falha em seu processo em segundo plano não prejudica seu aplicativo em primeiro plano.If your background process is running in another process, a crash in your background process won't take down your foreground application. Além disso, a atividade em segundo plano poderá ser encerrada, mesmo em seu aplicativo, se ela ultrapassar os limites de tempo de execução.Also, background activity can be terminated, even within your app, if it runs past execution time limits. Separar o trabalho em segundo plano em uma tarefa separada do aplicativo em primeiro plano pode ser uma opção melhor quando não é necessário que os processos em primeiro e segundo planos se comuniquem uns com os outros (uma vez que uma das principais vantagens de tarefas em segundo plano dentro do processo é que eles eliminam a necessidade de comunicação entre processos).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).
SimplicidadeSimplicity Tarefas em segundo plano dentro do processo único não exigem comunicação entre processos e são menos complexas de escrever.In-process background tasks don't require cross-process communication and are less complex to write.
Gatilhos disponíveisAvailable triggers As tarefas em segundo plano em andamento não dão suporte aos seguintes gatilhos: DeviceUseTrigger, DeviceServicingTrigger e IoTStartupTask.In-process background tasks don't support the following triggers: DeviceUseTrigger, DeviceServicingTrigger and IoTStartupTask.
VoIPVoIP Tarefas em segundo plano dentro do processo único não dão suporte à ativação de uma tarefa em segundo plano VoIP em seu aplicativo.In-process background tasks don't support activating a VoIP background task within your application.

Limites sobre o número de instâncias de gatilho: existem limites para a quantidade de instâncias de alguns gatilhos que um aplicativo pode registrar.Limits on the number of trigger instances: There are limits to how many instances of some triggers an app can register. Um aplicativo pode registrar somente ApplicationTrigger, MediaProcessingTrigger e DeviceUseTrigger uma vez a cada instância do aplicativo.An app can only register ApplicationTrigger, MediaProcessingTrigger and DeviceUseTrigger once per instance of the app. Se um aplicativo ultrapassa esse limite, o registro emite uma exceção.If an app goes over this limit, registration will throw an exception.

Cotas de CPU: as tarefas em segundo plano são limitadas pela quantidade de tempo de uso que elas obtêm com base no tipo de gatilho.CPU quotas: Background tasks are limited by the amount of wall-clock usage time they get based on trigger type. A maioria dos gatilhos são limitados a 30 segundos de uso de relógio, embora alguns tenham a capacidade de serem executados até 10 minutos para concluir tarefas de uso intensivo.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. As tarefas em segundo plano devem ser leves para economizar a duração da bateria e proporcionar melhor experiência do usuário para aplicativos em primeiro plano.Background tasks should be lightweight to save battery life and provide a better user experience for foreground apps. Consulte Dar suporte a seu aplicativo com tarefas em segundo plano para conhecer as restrições de recursos que se aplicam às tarefas em segundo plano.See Support your app with background tasks for the resource constraints applied to background tasks.

Gerenciar tarefas em segundo plano: seu aplicativo deve obter uma lista de tarefas em segundo plano registradas, registrar os manipuladores de progresso e conclusão e tratar esses eventos de forma adequada.Manage background tasks: Your app should get a list of registered background tasks, register for progress and completion handlers, and handle those events appropriately. Suas classes de tarefa em segundo plano devem relatar progresso, cancelamento e conclusão.Your background task classes should report progress, cancellation, and completion. Para obter mais informações, consulte Tratar uma tarefa em segundo plano canceladae Monitorar o progresso e a conclusão de tarefas em segundo plano.For more info see Handle a cancelled background task, and Monitor background task progress and completion.

Usar BackgroundTaskDeferral: se sua classe de tarefa em segundo plano executar código assíncrono, use adiamentos.Use BackgroundTaskDeferral: If your background task class runs asynchronous code, make sure to use deferrals. Caso contrário, a tarefa em segundo plano pode ser encerrada prematuramente quando o método Run retorna (ou o método OnBackgroundActivated no caso de tarefas em segundo plano em processo).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). Para obter mais informações, consulte Criar e registrar uma tarefa em segundo plano fora do processoFor more information, see Create and register an out-of-process background task.

Se preferir, solicite um adiamento e use async/await para concluir as chamadas de método assíncronas.Alternatively, request one deferral, and use async/await to complete asynchronous method calls. Feche o adiamento após as chamadas do método await.Close the deferral after the await method calls.

Atualizar o manifesto do aplicativo: para tarefas em segundo plano executadas fora do processo, declare cada tarefa em segundo plano no manifesto do aplicativo, juntamente com o tipo dos gatilhos usados.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. Do contrário, seu aplicativo não vai poder registrar a tarefa em segundo plano no tempo de execução.Otherwise your app will not be able to register the background task at runtime.

Se você tiver várias tarefas em segundo plano, considere se devem ser executadas no mesmo processo de host ou ser divididas em processos de host diferentes.If you have multiple background tasks, consider whether they should run in the same host process or be separated into different host processes. Coloque-as em processos de host separados se estiver preocupado que uma falha na tarefa em segundo possa gerar problemas para as tarefas em segundo plano.Put them in separate host processes if you are concerned that a failure in one background task could bring down other background tasks. Use a entrada do Grupo de recursos no designer de manifesto para agrupar tarefas em segundo plano nos processos de host diferentes.Use the Resource group entry in the manifest designer to group background tasks into different host processes.

Para definir o Grupo de recursos, abra o designer de Package.appxmanifest, escolha Declarações e adicione uma declaração de Serviço de aplicativo:To set the Resource group, open the Package.appxmanifest designer, choose Declarations, and add an App Service declaration:

Configuração do grupo de recursos

Consulte a referência de esquemas de aplicativo para obter mais informações sobre a configuração do grupo de recursos.See the application schema reference for more information about the resource group setting.

As tarefas em segundo plano que são executadas no mesmo processo do aplicativo em primeiro plano não precisam se declarar no manifesto do aplicativo.Background tasks that run in the same process as the foreground app do not need to declare themselves in the application manifest. Para obter mais informações sobre como declarar tarefas em segundo plano executadas fora do processo no manifesto, consulte Declarar tarefas em segundo plano no manifesto do aplicativo.For more information about declaring background tasks that run out-of-process in the manifest, see Declare background tasks in the application manifest.

Preparar-se para atualizações do aplicativo: se o seu aplicativo for atualizado, crie e registre uma tarefa em segundo plano ServicingComplete (consulte SystemTriggerType) para cancelar o registro das tarefas em segundo plano para a versão anterior do aplicativo e registre-as para a nova versão.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. Também é um momento apropriado para realizar atualizações do aplicativo que possam ser necessárias fora do contexto de execução em primeiro plano.This is also an appropriate time to perform app updates that may be necessary outside the context of running in the foreground.

Solicitar a execução de tarefas em segundo plano:Request to execute background tasks:

Importante A partir do Windows 10, os aplicativos não precisam mais estar na tela de bloqueio como um pré-requisito para executar tarefas em segundo plano.Important Starting in Windows 10, apps are no longer required to be on the lock screen as a prerequisite to run background tasks.

Os aplicativos UWP (Plataforma Universal do Windows) podem executar todos os tipos de tarefas com suporte sem serem fixados na tela de bloqueio.Universal Windows Platform (UWP) apps can run all supported task types without being pinned to the lock screen. No entanto, os aplicativos devem chamar Getaccessstate e verificar se o aplicativo não foi negado de ser executado em segundo plano.However, apps must call GetAccessState and check that the app is not denied from running in the background. Verifique se GetAccessStatus não retorna uma das enumerações negadas de BackgroundAccessStatus .Ensure that GetAccessStatus does not return one of the denied BackgroundAccessStatus enums. Por exemplo, esse método retornará BackgroundAccessStatus. DeniedByUser se o usuário tiver explicitamente permissões de tarefa em segundo plano negadas para seu aplicativo nas configurações do dispositivo.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.

Se seu aplicativo for negado de ser executado em segundo plano, seu aplicativo deverá chamar RequestAccessAsync e garantir que a resposta não seja negada antes de registrar tarefas em segundo plano.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.

Para obter mais informações sobre a escolha do usuário em relação à atividade em segundo plano e economia de bateria, consulte Otimizar a atividade em segundo plano.For more information on user choice around background activity and Battery Saver, see Optimize Background Activity.

Lista de verificação da tarefa em segundo planoBackground task checklist

Aplica-se a ambas as tarefas em segundo plano dentro e fora do processoApplies to both in-process and out-of-process background tasks

  • Associe a sua tarefa em segundo plano ao gatilho correto.Associate your background task with the correct trigger.
  • Adicione condições que ajudem a garantir uma execução bem-sucedida da tarefa em segundo plano.Add conditions to help ensure your background task runs successfully.
  • Trate o progresso, a conclusão e o cancelamento de tarefas em segundo plano.Handle background task progress, completion, and cancellation.
  • Registre novamente suas tarefas em segundo plano durante a inicialização do aplicativo.Re-register your background tasks during app launch. Isso garante que elas sejam registradas na primeira vez que o aplicativo for iniciado.This ensures that they are registered the first time the app is launched. Além disso, oferece uma forma de detectar se o usuário desabilitou as funcionalidades de execução em segundo plano do seu aplicativo (no caso de falhas de registro).It also provides a way to detect whether the user has disabled your app's background execution capabilities (in the event registration fails).
  • Verifique se há erros de registro de tarefas em segundo plano.Check for background task registration errors. Se for apropriado, tente registrar a tarefa em segundo plano novamente com valores de parâmetros diferentes.If appropriate, attempt to register the background task again with different parameter values.
  • Para todas as famílias de dispositivos, exceto desktop, caso haja pouca memória, as tarefas em segundo plano podem ser encerradas.For all device families except desktop, if the device becomes low on memory, background tasks may be terminated. Se uma exceção de falta de memória não surgir ou se o aplicativo não manipulá-la, a tarefa em segundo plano será encerrada sem aviso e sem gerar o evento 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. Isso ajuda a assegurar a experiência do usuário do aplicativo em primeiro plano.This helps to ensure the user experience of the app in the foreground. A tarefa em segundo plano deve ser projetada para tratar desse cenário.Your background task should be designed to handle this scenario.

Aplica-se apenas a tarefas em segundo plano fora do processoApplies only to out-of-process background tasks

  • Crie sua tarefa em segundo plano em um componente Windows Runtime.Create your background task in a Windows Runtime component.
  • Não exiba elementos da interface do usuário diferentes de notificações do sistema, blocos e atualizações de selo da tarefa em segundo plano.Do not display UI other than toasts, tiles, and badge updates from the background task.
  • No método Run, solicite adiamentos para cada chamada de método assíncrona e feche-os quando o método for concluído.In the Run method, request deferrals for each asynchronous method call, and close them when the method is done. Ou use um adiamento com async/await.Or, use one deferral with async/await.
  • Use o armazenamento persistente para compartilhar dados entre a tarefa em segundo plano e o aplicativo.Use persistent storage to share data between the background task and the app.
  • Declare cada tarefa em segundo plano no manifesto do aplicativo, juntamente com o tipo dos gatilhos usados.Declare each background task in the application manifest, along with the type of triggers it is used with. Verifique se o ponto de entrada e os tipos de gatilho estão corretos.Make sure the entry point and trigger types are correct.
  • Não especifique um elemento executável no manifesto, a menos que você esteja usando um gatilho que deva ser executado no mesmo contexto do aplicativo (como o 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).

Aplica-se apenas a tarefas em segundo plano dentro do processoApplies only to in-process background tasks

  • Ao cancelar uma tarefa, certifique-se de que o manipulador de eventos BackgroundActivated seja encerrado antes que ocorra o cancelamento ou todo o processo será finalizado.When cancelling a task, ensure that the BackgroundActivated event handler exits before the cancellation occurs or the whole process will be terminated.
  • Elabore tarefas em segundo plano de curta duração.Write background tasks that are short-lived. A maioria das tarefas em segundo plano é limitada a 30 segundos de uso do relógio de parede.Most background tasks are limited to 30 seconds of wall-clock usage.

Coisas a serem evitadasThings to avoid

  • Minimize o uso de comunicação entre processos via COM ou RPC.Minimize the use of inter-process communication via COM or RPC.
  • O processo com o qual você está tentando se comunicar pode não estar em um estado de execução, o que pode resultar em uma falha.The process you are trying to communicate with may not be in a running state which can result in a hang.
  • Uma quantidade significativa de tempo pode ser gasta facilitando a comunicação entre processos e será contabilizada em relação ao tempo alocado para executar a tarefa em segundo plano.A significant amount of time could be spent facilitating cross process communication, and will count against the time allotted to run your background task.
  • Não conte com a interação do usuário nas tarefas em segundo plano.Do not rely on user interaction in background tasks.