Compartilhar via


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.