Поделиться через


Отправка рабочего элемента с помощью таймера

Основные API

Узнайте, как создать рабочий элемент, который выполняется после истечения таймера.

Создание одноразового таймера

Используйте метод CreateTimer для создания таймера для рабочего элемента. Укажите лямбда-выражение, которое выполняет работу, и используйте параметр задержки , чтобы указать, сколько времени должен ждать пул потоков, прежде чем он сможет назначить рабочий элемент доступному потоку. Задержка задается с помощью структуры TimeSpan.

Примечание Можно использовать CoreDispatcher.RunAsync для доступа к пользовательскому интерфейсу и отображения хода выполнения из рабочего элемента.

В следующем примере создается рабочий элемент, который выполняется в три минуты:

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

Предоставьте обработчик завершения

При необходимости обработайте завершение и отмену рабочего элемента с помощью TimerDestroyedHandler. Используйте перегрузку CreateTimer для передачи дополнительной лямбды. Это выполняется при отмене таймера или после завершения рабочего элемента.

В следующем примере создается таймер, который отправляет рабочий элемент и вызывает метод, когда рабочий элемент завершается или таймер отменяется.

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.
                    }

                }));
        }));

Отмена таймера

Если таймер по-прежнему отсчитывает время, но рабочий элемент больше не нужен, вызовите команду Отмена. Таймер отменён, и рабочий элемент не будет отправлен в пул потоков.

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

Замечания

Приложения универсальной платформы Windows (UWP) не могут использовать Thread.Sleep, так как он может блокировать поток пользовательского интерфейса. Вы можете использовать ThreadPoolTimer для создания рабочего элемента, что позволит задержать выполнение задачи этим элементом без блокировки потока пользовательского интерфейса.

См. пример пула потоков в для полного примера кода, демонстрирующего рабочие элементы, элементы таймера и периодические рабочие элементы. Пример кода изначально был написан для Windows 8.1, но код можно повторно использовать в Windows 10.

Сведения о повторяющихся таймерах см. в статье Создание периодического рабочего элемента.