Criar um item de trabalho periódico
APIs importantes
Saiba como criar um item de trabalho periódico que se repete periodicamente.
Criar o item de trabalho periódico
Use o método CreatePeriodicTimer para criar um item de trabalho periódico. Forneça um lambda que realize o trabalho e use o parâmetro period para especificar o intervalo entre os envios. O período é especificado usando uma estrutura TimeSpan. O item de trabalho será reenviado sempre que o período decorrer, portanto, verifique se o período é longo o suficiente para que o trabalho seja concluído.
CreateTimer retorna um objeto ThreadPoolTimer. Armazene este objeto caso o cronômetro precise ser cancelado.
Observação Evite especificar um valor zero (ou qualquer valor menor que um milissegundo) para o intervalo. Isso faz com que o temporizador periódico se comporte como um temporizador de disparo único.
Observação Você pode usar CoreDispatcher.RunAsync para acessar a interface do usuário e mostrar o progresso do item de trabalho.
O exemplo a seguir cria um item de trabalho que é executado uma vez a cada 60 segundos:
TimeSpan period = TimeSpan.FromSeconds(60);
ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
});
}, period);
TimeSpan period;
period.Duration = 60 * 10000000; // 10,000,000 ticks per second
ThreadPoolTimer ^ PeriodicTimer = ThreadPoolTimer::CreatePeriodicTimer(
ref new TimerElapsedHandler([this](ThreadPoolTimer^ source)
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([this]()
{
//
// UI components can be accessed within this scope.
//
}));
}), period);
Manipular o cancelamento do item de trabalho periódico (opcional)
Se necessário, você pode lidar com o cancelamento do temporizador periódico com um TimerDestroyedHandler. Use a sobrecarga CreatePeriodicTimer para fornecer um lambda adicional que manipule o cancelamento do item de trabalho periódico.
O exemplo a seguir cria um item de trabalho periódico que se repete a cada 60 segundos e também fornece um manipulador de cancelamento:
using Windows.System.Threading;
TimeSpan period = TimeSpan.FromSeconds(60);
ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
});
},
period,
(source) =>
{
//
// TODO: Handle periodic timer cancellation.
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher->RunAsync(CoreDispatcherPriority.High,
()=>
{
//
// UI components can be accessed within this scope.
//
// Periodic timer cancelled.
}));
});
using namespace Windows::System::Threading;
using namespace Windows::UI::Core;
TimeSpan period;
period.Duration = 60 * 10000000; // 10,000,000 ticks per second
ThreadPoolTimer ^ PeriodicTimer = ThreadPoolTimer::CreatePeriodicTimer(
ref new TimerElapsedHandler([this](ThreadPoolTimer^ source)
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([this]()
{
//
// UI components can be accessed within this scope.
//
}));
}),
period,
ref new TimerDestroyedHandler([&](ThreadPoolTimer ^ source)
{
//
// TODO: Handle periodic timer cancellation.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([&]()
{
//
// UI components can be accessed within this scope.
//
// Periodic timer cancelled.
}));
}));
Cancelar o cronômetro
Quando necessário, chame o método Cancel para impedir que o item de trabalho periódico se repita. Se o item de trabalho estiver em execução quando o temporizador periódico for cancelado, ele poderá ser concluído. O TimerDestroyedHandler (se fornecido) é chamado quando todas as instâncias do item de trabalho periódico são concluídas.
PeriodicTimer.Cancel();
PeriodicTimer->Cancel();
Comentários
Para obter informações sobre temporizadores de uso único, consulte Usar um temporizador para enviar um item de trabalho.