Создание периодического рабочего элемента
Важные API
Узнайте, как создать рабочий элемент, повторяющийся периодически.
Создание периодического рабочего элемента
Используйте метод CreatePeriodicTimer для создания периодического рабочего элемента. Укажите лямбда-файл, который выполняет работу, и используйте параметр периода , чтобы указать интервал между отправками. Этот период задается с помощью структуры 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);
Обработка отмены периодического рабочего элемента (необязательно)
При необходимости можно обработать отмену периодического таймера с помощью TimerDebiedHandler. Используйте перегрузку 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 , чтобы остановить периодический рабочий элемент повторения. Если рабочий элемент выполняется при отмене периодического таймера, его можно завершить. ТаймерDebiedHandler (если указан) вызывается при завершении всех экземпляров периодического рабочего элемента.
PeriodicTimer.Cancel();
PeriodicTimer->Cancel();
Замечания
Сведения об однопользовательских таймерах см. в разделе "Использование таймера для отправки рабочего элемента".