Partilhar via


Usar um temporizador para enviar um item de trabalho

APIs importantes

Saiba como criar um item de trabalho que seja executado após um temporizador.

Criar um temporizador de disparo único

Use o método CreateTimer para criar um temporizador para o item de trabalho. Forneça um lambda que realize o trabalho e use o parâmetro delay para especificar quanto tempo o pool de threads aguarda antes de poder atribuir o item de trabalho a um thread disponível. O atraso é especificado usando uma estrutura TimeSpan.

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 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);

Fornecer um manipulador de conclusão

Se necessário, manipule 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 cronômetro

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 ao pool de threads.

DelayTimer.Cancel();
DelayTimer->Cancel();

Comentários

Os aplicativos da Plataforma Universal do Windows (UWP) não podem usar Thread.Sleep porque ele pode bloquear o thread da interface do usuário. Você pode usar um ThreadPoolTimer para criar um item de trabalho, e isso atrasará a tarefa realizada pelo item de trabalho sem bloquear o thread da interface do usuário.

Consulte o exemplo de pool de threads para obter um exemplo de código completo que demonstra itens de trabalho, itens de trabalho de timer e itens de trabalho periódicos. O exemplo de código foi originalmente escrito para Windows 8.1, mas o código pode ser reutilizado em Windows 10.

Para obter informações sobre temporizadores de repetição, consulte Criar um item de trabalho periódico.