Monitorar o progresso e a conclusão de tarefas em segundo plano
APIs importantes
Saiba como seu aplicativo pode reconhecer o progresso e a conclusão relatados por uma tarefa em segundo plano que é executada fora do processo. (Para tarefas em segundo plano no processo, você pode definir variáveis compartilhadas para significar o progresso e a conclusão.)
O progresso e a conclusão da tarefa em segundo plano podem ser monitorados pelo código do aplicativo. Para fazer isso, o aplicativo assina eventos da(s) tarefa(s) em segundo plano que registrou no sistema.
- Este tópico pressupõe que você tenha um aplicativo que registra tarefas em segundo plano. Para começar a criar rapidamente uma tarefa em segundo plano, consulte Criar e registrar uma tarefa em segundo plano em processo ou Criar e registrar uma tarefa em segundo plano fora do processo. Para obter informações mais detalhadas sobre condições e gatilhos, consulte Dar suporte ao seu aplicativo com tarefas em segundo plano.
Criar um manipulador de eventos para lidar com tarefas em segundo plano concluídas
Etapa 1
Crie uma função de manipulador de eventos para lidar com tarefas em segundo plano concluídas. Esse código precisa seguir um volume específico, que usa um objeto IBackgroundTaskRegistration e um objeto BackgroundTaskCompletedEventArgs.
Use o volume a seguir para o método do manipulador de eventos de tarefa em segundo plano OnCompleted .
private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
// TODO: Add code that deals with background task completion.
}
auto completed{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
// TODO: Add code that deals with background task completion.
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{
// TODO: Add code that deals with background task completion.
};
Etapa 2
Adicione código ao manipulador de eventos que lida com a conclusão da tarefa em segundo plano.
Por exemplo, o exemplo de tarefa em segundo plano atualiza a interface do usuário.
private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
UpdateUI();
}
auto completed{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
UpdateUI();
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{
UpdateUI();
};
Criar uma função de manipulador de eventos para lidar com o progresso da tarefa em segundo plano
Etapa 1
Crie uma função de manipulador de eventos para lidar com tarefas em segundo plano concluídas. Esse código precisa seguir um volume específico, que usa um objeto IBackgroundTaskRegistration e um objeto BackgroundTaskProgressEventArgs:
Use o seguinte volume para o método do manipulador de eventos de tarefa em segundo plano OnProgress:
private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
// TODO: Add code that deals with background task progress.
}
auto progress{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& /* args */)
{
// TODO: Add code that deals with background task progress.
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
// TODO: Add code that deals with background task progress.
};
Etapa 2
Adicione código ao manipulador de eventos que lida com a conclusão da tarefa em segundo plano.
Por exemplo, o exemplo de tarefa em segundo plano atualiza a interface do usuário com o status de progresso passado por meio do parâmetro args :
private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
var progress = "Progress: " + args.Progress + "%";
BackgroundTaskSample.SampleBackgroundTaskProgress = progress;
UpdateUI();
}
auto progress{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
{
winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
auto progress = "Progress: " + args->Progress + "%";
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
};
Registrar as funções do manipulador de eventos com tarefas em segundo plano novas e existentes
Etapa 1
Quando o aplicativo registra uma tarefa em segundo plano pela primeira vez, ele deve se registrar para receber atualizações de progresso e conclusão para ela, caso a tarefa seja executada enquanto o aplicativo ainda estiver ativo em primeiro plano.
Por exemplo, o exemplo de tarefa em segundo plano chama a seguinte função em cada tarefa em segundo plano que ele registra:
private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
{
task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(Windows::ApplicationModel::Background::IBackgroundTaskRegistration const& task)
{
auto progress{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
{
winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
} };
task.Progress(progress);
auto completed{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
UpdateUI();
} };
task.Completed(completed);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration^ task)
{
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
auto progress = "Progress: " + args->Progress + "%";
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
};
task->Progress += ref new BackgroundTaskProgressEventHandler(progress);
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{
UpdateUI();
};
task->Completed += ref new BackgroundTaskCompletedEventHandler(completed);
}
Etapa 2
Quando o aplicativo é iniciado ou navega para uma nova página em que o status da tarefa em segundo plano é relevante, ele deve obter uma lista de tarefas em segundo plano atualmente registradas e associá-las às funções do manipulador de eventos de progresso e conclusão. A lista de tarefas em segundo plano atualmente registradas pelo aplicativo é mantida no BackgroundTaskRegistration.AllTasks.
Por exemplo, o exemplo de tarefa em segundo plano usa o código a seguir para anexar manipuladores de eventos quando a página SampleBackgroundTask é navegada:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
foreach (var task in BackgroundTaskRegistration.AllTasks)
{
if (task.Value.Name == BackgroundTaskSample.SampleBackgroundTaskName)
{
AttachProgressAndCompletedHandlers(task.Value);
BackgroundTaskSample.UpdateBackgroundTaskStatus(BackgroundTaskSample.SampleBackgroundTaskName, true);
}
}
UpdateUI();
}
void SampleBackgroundTask::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& /* e */)
{
// A pointer back to the main page. This is needed if you want to call methods in MainPage such
// as NotifyUser().
m_rootPage = MainPage::Current;
// Attach progress and completed handlers to any existing tasks.
auto allTasks{ Windows::ApplicationModel::Background::BackgroundTaskRegistration::AllTasks() };
for (auto const& task : allTasks)
{
if (task.Value().Name() == SampleBackgroundTaskName)
{
AttachProgressAndCompletedHandlers(task.Value());
break;
}
}
UpdateUI();
}
void SampleBackgroundTask::OnNavigatedTo(NavigationEventArgs^ e)
{
// A pointer back to the main page. This is needed if you want to call methods in MainPage such
// as NotifyUser().
rootPage = MainPage::Current;
// Attach progress and completed handlers to any existing tasks.
auto iter = BackgroundTaskRegistration::AllTasks->First();
auto hascur = iter->HasCurrent;
while (hascur)
{
auto cur = iter->Current->Value;
if (cur->Name == SampleBackgroundTaskName)
{
AttachProgressAndCompletedHandlers(cur);
break;
}
hascur = iter->MoveNext();
}
UpdateUI();
}
Tópicos relacionados
- Crie e registre uma tarefa em segundo plano em processo.
- Criar e registrar uma tarefa em segundo plano fora do processo.
- Declarar tarefas em segundo plano no manifesto do app
- Tratar uma tarefa em segundo plano cancelada
- Registrar uma tarefa em segundo plano
- Responder a eventos do sistema com tarefas em segundo plano
- Definir condições para executar uma tarefa em segundo plano
- Atualizar um bloco dinâmico de uma tarefa em segundo plano
- Usar um gatilho de manutenção
- Executar uma tarefa em segundo plano em um temporizador
- Diretrizes para tarefas em segundo plano
- Depurar uma tarefa em segundo plano
- Como disparar eventos de suspensão, retomada e em segundo plano em aplicativos UWP (durante a depuração)