Создание периодического рабочего элемента

Важные API

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

Создание периодического рабочего элемента

Для создания периодического рабочего элемента используется метод CreatePeriodicTimer. Создайте лямбда-функцию, выполняющую работу, и используйте параметр period для указания интервала между отправками. Период указывается с помощью структуры TimeSpan. Рабочий элемент будет отправляться каждый раз по истечении периода времени, поэтому убедитесь, что этот период является достаточным для завершения работы.

CreateTimer возвращает объект ThreadPoolTimer. Храните этот объект на случай, если таймер придется отменить.

Примечание Не указывайте нулевое значение (или любое значение меньше одной миллисекунды) для интервала. Это приведет к тому, что периодический таймер будет вести себя как одиночный.

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

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

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

Обработка отмены периодического рабочего элемента (необязательно)

При необходимости можно обработать отмену периодического таймера с помощью TimerDestroyedHandler. Используйте перегрузку CreatePeriodicTimer для создания дополнительной лямбда-функции, которая обрабатывает отмену периодического рабочего элемента.

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

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.

                }));
        }));

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

При необходимости вызовите метод Cancel, чтобы отменить повторы периодического рабочего элемента. Если рабочий элемент запущен во время отмены периодического таймера, ему будет разрешено завершиться. Метод TimerDestroyedHandler (если предоставлен) вызывается, когда все экземпляры периодического рабочего элемента завершили работу.

PeriodicTimer.Cancel();
PeriodicTimer->Cancel();

Комментарии

Подробнее об одиночных таймерах см. в разделе Отправка рабочего элемента по таймеру.