Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
APIs importantes
Saiba como criar um item de trabalho que é executado quando um temporizador expira.
Criar um temporizador de tiro único
Use o método CreateTimer para criar um temporizador para o item de trabalho. Forneça um lambda que realiza o trabalho e use o parâmetro de atraso para especificar por quanto tempo o pool de threads aguarda antes que ele possa atribuir o item de trabalho a um thread disponível. O atraso é especificado usando uma estrutura TimeSpan .
Note
Em aplicativos WinUI 3, use DispatcherQueue.TryEnqueue de Microsoft.UI.Dispatching.DispatcherQueue para acessar a thread da interface do usuário e exibir o progresso do item de trabalho. Confira a visão geral do DispatcherQueue para obter detalhes.
O exemplo a seguir cria um item de trabalho executado em três minutos:
TimeSpan delay = TimeSpan.FromMinutes(3);
ThreadPoolTimer DelayTimer = ThreadPoolTimer.CreateTimer(
(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.
//
});
}, delay);
TimeSpan delay;
delay.Duration = 3 * 60 * 10000000; // 10,000,000 ticks per second
ThreadPoolTimer ^ DelayTimer = ThreadPoolTimer::CreateTimer(
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.
//
ExampleUIUpdateMethod("Timer completed.");
}));
}), delay);
Forneça um manipulador de conclusão
Se necessário, gerencie o cancelamento e a conclusão do item de trabalho com um TimerDestroyedHandler. Use a sobrecarga CreateTimer para fornecer um lambda adicional. Isso é executado quando o temporizador é cancelado ou quando o item de trabalho é concluído.
O exemplo a seguir cria um temporizador que envia o item de trabalho e chama um método quando o item de trabalho é concluído ou o temporizador é cancelado:
TimeSpan delay = TimeSpan.FromMinutes(3);
bool completed = false;
ThreadPoolTimer DelayTimer = ThreadPoolTimer.CreateTimer(
(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.
//
});
completed = true;
},
delay,
(source) =>
{
//
// TODO: Handle work cancellation/completion.
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher.RunAsync(
CoreDispatcherPriority.High,
() =>
{
//
// UI components can be accessed within this scope.
//
if (completed)
{
// Timer completed.
}
else
{
// Timer cancelled.
}
});
});
TimeSpan delay;
delay.Duration = 3 * 60 * 10000000; // 10,000,000 ticks per second
completed = false;
ThreadPoolTimer ^ DelayTimer = ThreadPoolTimer::CreateTimer(
ref new TimerElapsedHandler([&](ThreadPoolTimer ^ source)
{
//
// TODO: Work
//
//
// Update the UI thread by using the UI core dispatcher.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([&]()
{
//
// UI components can be accessed within this scope.
//
}));
completed = true;
}),
delay,
ref new TimerDestroyedHandler([&](ThreadPoolTimer ^ source)
{
//
// TODO: Handle work cancellation/completion.
//
Dispatcher->RunAsync(CoreDispatcherPriority::High,
ref new DispatchedHandler([&]()
{
//
// Update the UI thread by using the UI core dispatcher.
//
if (completed)
{
// Timer completed.
}
else
{
// Timer cancelled.
}
}));
}));
Cancelar o temporizador
Se o temporizador ainda estiver em contagem regressiva, mas o item de trabalho não for mais necessário, chame Cancelar. O temporizador é cancelado e o item de trabalho não será enviado para o pool de threads.
DelayTimer.Cancel();
DelayTimer->Cancel();
Remarks
Aplicativos do Windows devem evitar Thread.Sleep porque ele bloqueia a thread chamadora, o que pode fazer com que a interface do usuário pare de responder se for chamado na thread da interface do usuário. Você pode usar um ThreadPoolTimer para criar um item de trabalho, o que atrasará a tarefa executada pelo item de trabalho sem bloquear a thread da interface do usuário.
Consulte o exemplo do pool de threads para ver um exemplo de código completo que demonstra itens de trabalho, itens de trabalho com temporizador e itens de trabalho periódicos. O exemplo de código foi originalmente escrito para Windows 8.1 mas o código pode ser reutilize no Windows 10.
Para obter informações sobre temporizadores recorrentes, consulte Criar um item de trabalho periódico.
Tópicos relacionados:
Windows developer