Compartilhar via


Executar uma tarefa em segundo plano em um temporizador

Saiba como usar o TimeTrigger para agendar uma tarefa única em segundo plano ou executar uma tarefa periódica em segundo plano.

Consulte Scenario4 no exemplo de ativação em segundo plano para ver um exemplo de como implementar a tarefa em segundo plano disparada por tempo descrita neste tópico.

Este tópico pressupõe que você tenha uma tarefa em segundo plano que precisa ser executada periodicamente ou em um horário específico. Se você ainda não tiver uma tarefa em segundo plano, há um exemplo de tarefa em segundo plano em BackgroundActivity.cs. Ou siga as etapas em Criar e registrar uma tarefa em segundo plano em processo ou Criar e registrar uma tarefa em segundo plano fora do processo para criar uma.

Criar um gatilho de tempo

Crie um novo TimeTrigger. O segundo parâmetro, OneShot, especifica se a tarefa em segundo plano será executada apenas uma vez ou continuará sendo executada periodicamente. Se OneShot estiver definido como true, o primeiro parâmetro (FreshnessTime) especificará o número de minutos a aguardar antes de agendar a tarefa em segundo plano. Se OneShot for definido como false, FreshnessTime especificará a frequência na qual a tarefa em segundo plano será executada.

O temporizador interno para aplicativos UWP (Plataforma Universal do Windows) direcionados à família de computadores ou dispositivos móveis executa tarefas em segundo plano em intervalos de 15 minutos. (O temporizador é executado em intervalos de 15 minutos para que o sistema só precise ser ativado uma vez a cada 15 minutos para ativar os aplicativos que solicitaram TimerTriggers, o que economiza energia.)

  • Se FreshnessTime estiver definido como 15 minutos e OneShot for verdadeiro, a tarefa será agendada para ser executada uma vez, começando entre 15 e 30 minutos a partir do momento em que for registrada. Se estiver definido como 25 minutos e o OneShot for verdadeiro, a tarefa será agendada para ser executada uma vez, começando entre 25 e 40 minutos a partir do momento em que for registrada.

  • Se FreshnessTime estiver definido como 15 minutos e OneShot for falso, a tarefa será agendada para ser executada a cada 15 minutos, começando entre 15 e 30 minutos a partir do momento em que for registrada. Se estiver definido como n minutos e o OneShot for falso, a tarefa será agendada para ser executada a cada n minutos começando entre n e n + 15 minutos após ser registrada.

Observação

Se FreshnessTime for definido como menos de 15 minutos, uma exceção será lançada ao tentar registrar a tarefa em segundo plano.

Por exemplo, esse gatilho fará com que uma tarefa em segundo plano seja executada uma vez por hora.

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(Opcional) Adicionar uma condição

Você pode criar uma condição de tarefa em segundo plano para controlar quando a tarefa é executada. Uma condição impede que a tarefa em segundo plano seja executada até que a condição seja atendida. Para obter mais informações, consulte Definir condições para executar uma tarefa em segundo plano.

Neste exemplo, a condição é definida como UserPresent para que, uma vez disparada, a tarefa só seja executada quando o usuário estiver ativo. Para obter uma lista de condições possíveis, consulte SystemConditionType.

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

Para obter informações mais detalhadas sobre condições e tipos de gatilhos em segundo plano, consulte Dar suporte ao seu aplicativo com tarefas em segundo plano.

Chamar RequestAccessAsync()

Antes de registrar a tarefa em segundo plano ApplicationTrigger , chame RequestAccessAsync para determinar o nível de atividade em segundo plano que o usuário permite porque o usuário pode ter desabilitado a atividade em segundo plano para seu aplicativo. Consulte Otimizar a atividade em segundo plano para obter mais informações sobre como os usuários podem controlar as configurações da atividade em segundo plano.

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

Registrar a tarefa em segundo plano

Registre a tarefa em segundo plano chamando sua função de registro de tarefa em segundo plano. Para obter mais informações sobre como registrar tarefas em segundo plano e ver a definição do método RegisterBackgroundTask() no código de exemplo abaixo, consulte Registrar uma tarefa em segundo plano.

Importante

Para tarefas em segundo plano executadas no mesmo processo que seu aplicativo, não defina entryPoint. Para tarefas em segundo plano executadas em um processo separado do seu aplicativo, defina entryPoint como o namespace, '.', e o nome da classe que contém a implementação da tarefa em segundo plano.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

Os parâmetros de registro de tarefa em segundo plano são validados no momento do registro. Um erro será retornado se qualquer um dos parâmetros de registro for inválido. Certifique-se de que seu aplicativo lide normalmente com cenários em que o registro de tarefa em segundo plano falha – se, em vez disso, seu aplicativo depender de ter um objeto de registro válido depois de tentar registrar uma tarefa, ele poderá falhar.

Gerenciar recursos para sua tarefa em segundo plano

Use BackgroundExecutionManager.RequestAccessAsync para determinar se o usuário decidiu que a atividade em segundo plano do aplicativo deve ser limitada. Esteja ciente do uso da bateria e só execute em segundo plano quando for necessário concluir uma ação que o usuário deseja. Consulte Otimizar a atividade em segundo plano para obter mais informações sobre como os usuários podem controlar as configurações da atividade em segundo plano.

  • Memória: ajustar o uso de memória e energia do aplicativo é fundamental para garantir que o sistema operacional permita que sua tarefa em segundo plano seja executada. Use as APIs de Gerenciamento de Memória para ver quanta memória sua tarefa em segundo plano está usando. Quanto mais memória sua tarefa em segundo plano usar, mais difícil será para o sistema operacional mantê-la em execução quando outro aplicativo estiver em primeiro plano. Em última análise, o usuário está no controle de todas as atividades em segundo plano que seu aplicativo pode executar e tem visibilidade sobre o impacto que seu aplicativo tem no uso da bateria.
  • Tempo de CPU: as tarefas em segundo plano são limitadas pela quantidade de tempo de uso do relógio de parede que elas obtêm com base no tipo de gatilho.

Consulte Dar suporte ao seu aplicativo com tarefas em segundo plano para obter as restrições de recursos aplicadas a tarefas em segundo plano.

Comentários

A partir do Windows 10, não é mais necessário que o usuário adicione seu aplicativo à tela de bloqueio para utilizar tarefas em segundo plano.

Uma tarefa em segundo plano só será executada usando um TimeTrigger se você tiver chamado RequestAccessAsync primeiro.