Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
APIs importantes
Saiba como criar uma função que pode ser reutilizada para registrar com segurança a maioria das tarefas em segundo plano.
Este tópico é aplicável a tarefas em segundo plano em processo e tarefas em segundo plano fora do processo. Este tópico pressupõe que você já tenha uma tarefa em segundo plano que precisa ser registrada. (Consulte Criar e registrar uma tarefa em segundo plano que é executada fora do processo ou Criar e registrar uma tarefa em segundo plano que é executada no processo para obter informações sobre como escrever uma tarefa em segundo plano).
Este tópico percorre uma função de utilitário que registra tarefas em segundo plano. Esta função do utilitário verifica os registros existentes primeiro antes de registrar a tarefa várias vezes para evitar problemas com vários registros e pode aplicar uma condição do sistema à tarefa em segundo plano. O passo a passo inclui um exemplo completo e funcional dessa função utilitária.
Nota
Os aplicativos universais do Windows devem chamar RequestAccessAsync antes de registrar qualquer um dos tipos de gatilho em segundo plano.
Para garantir que seu aplicativo Universal do Windows continue a ser executado corretamente após o lançamento de uma atualização, você deve chamar RemoveAccess e, em seguida, chamar RequestAccessAsync quando seu aplicativo for iniciado após a atualização. Para obter mais informações, consulte Diretrizes para tarefas em segundo plano.
Definir a assinatura do método e o tipo de retorno
Esse método recebe o ponto de entrada da tarefa, o nome da tarefa, um gatilho de tarefa em segundo plano pré-construído e (opcionalmente) uma SystemCondition para a tarefa em segundo plano. Esse método retorna um BackgroundTaskRegistration objeto.
Importante
taskEntryPoint - Para tarefas em segundo plano que são executadas fora do processo, isso deve ser construído como o nome do namespace, '.', e o nome da classe que contém sua classe de plano de fundo. A cadeia de caracteres diferencia maiúsculas de minúsculas. Por exemplo, se você tivesse um namespace "MyBackgroundTasks" e uma classe "BackgroundTask1" que contivesse seu código de classe de plano de fundo, a cadeia de caracteres para taskEntryPoint seria "MyBackgroundTasks.BackgroundTask1".
Se a sua tarefa em segundo plano for executada no mesmo processo que a sua aplicação (ou seja, uma tarefa em segundo plano em processo) taskEntryPoint não deve ser definida.
public static BackgroundTaskRegistration RegisterBackgroundTask(
string taskEntryPoint,
string name,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
// We'll add code to this function in subsequent steps.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
// We'll add code to this function in subsequent steps.
}
Verificar se existem registos
Verifique se a tarefa já está registada. É importante verificar isso porque se uma tarefa for registrada várias vezes, ela será executada mais de uma vez sempre que for acionada; isso pode usar o excesso de CPU e pode causar um comportamento inesperado.
Você pode verificar se há registros existentes consultando a propriedade BackgroundTaskRegistration.AllTasks e iterando o resultado. Verifique o nome de cada instância – se corresponder ao nome da tarefa que você está registrando, saia do loop e defina uma variável de sinalizador para que seu código possa escolher um caminho diferente na próxima etapa.
Observação Use nomes de tarefas em segundo plano que sejam exclusivos do seu aplicativo. Verifique se cada tarefa em segundo plano tem um nome exclusivo.
O código a seguir registra uma tarefa em segundo plano usando o SystemTrigger que criamos na última etapa:
public static BackgroundTaskRegistration RegisterBackgroundTask(
string taskEntryPoint,
string name,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
//
// Check for existing registrations of this background task.
//
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == name)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
// We'll register the task in the next step.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
//
// Check for existing registrations of this background task.
//
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if(cur->Name == name)
{
//
// The task is registered.
//
return (BackgroundTaskRegistration ^)(cur);
}
hascur = iter->MoveNext();
}
// We'll register the task in the next step.
}
Registrar a tarefa em segundo plano (ou retornar o registro existente)
Verifique se a tarefa foi encontrada na lista de registros de tarefas em segundo plano existentes. Em caso afirmativo, retorne essa instância da tarefa.
Em seguida, registre a tarefa usando um novo objeto
Observação Os parâmetros de registro da 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 lida normalmente com cenários em que o registro de tarefas 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. Observação Se você estiver registrando uma tarefa em segundo plano que é executada no mesmo processo que seu aplicativo, envie
String.Emptyounullpara o parâmetrotaskEntryPoint.
O exemplo a seguir retorna a tarefa existente ou adiciona código que registra a tarefa em segundo plano (incluindo a condição opcional do sistema, se presente):
public static BackgroundTaskRegistration RegisterBackgroundTask(
string taskEntryPoint,
string name,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
//
// Check for existing registrations of this background task.
//
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == taskName)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
//
// Register the background task.
//
var builder = new BackgroundTaskBuilder();
builder.Name = name;
// in-process background tasks don't set TaskEntryPoint
if ( taskEntryPoint != null && taskEntryPoint != String.Empty)
{
builder.TaskEntryPoint = taskEntryPoint;
}
builder.SetTrigger(trigger);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
return task;
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
//
// Check for existing registrations of this background task.
//
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if(cur->Name == name)
{
//
// The task is registered.
//
return (BackgroundTaskRegistration ^)(cur);
}
hascur = iter->MoveNext();
}
//
// Register the background task.
//
auto builder = ref new BackgroundTaskBuilder();
builder->Name = name;
builder->TaskEntryPoint = taskEntryPoint;
builder->SetTrigger(trigger);
if (condition != nullptr) {
builder->AddCondition(condition);
}
BackgroundTaskRegistration ^ task = builder->Register();
return task;
}
Conclua a função do utilitário de registro de tarefas em segundo plano
Este exemplo mostra a função de registro de tarefa em segundo plano concluída. Esta função pode ser usada para registrar a maioria das tarefas em segundo plano, com exceção das tarefas em segundo plano de rede.
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,
string taskName,
IBackgroundTrigger trigger,
IBackgroundCondition condition)
{
//
// Check for existing registrations of this background task.
//
foreach (var cur in BackgroundTaskRegistration.AllTasks)
{
if (cur.Value.Name == taskName)
{
//
// The task is already registered.
//
return (BackgroundTaskRegistration)(cur.Value);
}
}
//
// Register the background task.
//
var builder = new BackgroundTaskBuilder();
builder.Name = taskName;
builder.TaskEntryPoint = taskEntryPoint;
builder.SetTrigger(trigger);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
return task;
}
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(Platform::String ^ taskEntryPoint,
Platform::String ^ taskName,
IBackgroundTrigger ^ trigger,
IBackgroundCondition ^ condition)
{
//
// Check for existing registrations of this background task.
//
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if(cur->Name == name)
{
//
// The task is registered.
//
return (BackgroundTaskRegistration ^)(cur);
}
hascur = iter->MoveNext();
}
//
// Register the background task.
//
auto builder = ref new BackgroundTaskBuilder();
builder->Name = name;
builder->TaskEntryPoint = taskEntryPoint;
builder->SetTrigger(trigger);
if (condition != nullptr) {
builder->AddCondition(condition);
}
BackgroundTaskRegistration ^ task = builder->Register();
return task;
}
Tópicos relacionados
- Criar e registrar uma tarefa em segundo plano fora do processo
- Criar e registrar uma tarefa em segundo plano em execução
- Declarar tarefas em segundo plano no manifesto do aplicativo
- Lidar com uma tarefa em segundo plano cancelada
- Monitorar o progresso e a conclusão de tarefas em segundo plano
- Responda aos eventos do sistema com tarefas em segundo plano
- Definir condições para executar uma tarefa em segundo plano
- Atualizar um mosaico dinâmico a partir de uma tarefa em segundo plano
- Use um gatilho de manutenção
- Executar uma tarefa em segundo plano em um temporizador
- Diretrizes para tarefas em segundo plano
- Debugar uma tarefa em segundo plano
- Como desencadear eventos de suspensão, retomada e em segundo plano em aplicações UWP (durante a depuração)