Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
.NET предоставляет три таймера для использования в многопоточной среде:
- System.Threading.Timer, который выполняет единственный метод обратного вызова в потоке ThreadPool через регулярные интервалы.
- System.Timers.Timer, который по умолчанию вызывает событие в потоке ThreadPool через регулярные интервалы.
- System.Threading.PeriodicTimer, который позволяет вызывающим выполнять работу после ожидания отдельных галок таймера.
Замечание
Некоторые реализации .NET могут включать дополнительные таймеры:
- System.Windows.Forms.Timer: компонент Windows Forms, который запускает событие через регулярные интервалы. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточной среде.
- System.Web.UI.Timer: компонент ASP.NET, выполняющий асинхронную или синхронную обратную передачу веб-страницы через регулярный интервал.
- System.Windows.Threading.DispatcherTimer: таймер, интегрированный в Dispatcher очередь, которая обрабатывается с заданным интервалом времени и заданным приоритетом.
Класс System.Threading.Timer
Класс System.Threading.Timer позволяет непрерывно вызывать делегат в указанные интервалы времени. Этот класс также можно использовать для планирования одного вызова делегата в заданном интервале времени. Делегат выполняется в потоке ThreadPool .
При создании System.Threading.Timer объекта необходимо указать TimerCallback делегат, определяющий метод обратного вызова, необязательный объект состояния, передаваемый обратному вызову, время задержки до первого вызова обратного вызова и интервал времени между вызовами обратного вызова. Чтобы отменить ожидающий таймер, вызовите Timer.Dispose метод.
В следующем примере создается таймер, который вызывает предоставленный делегат в первый раз после одной секунды (1000 миллисекунд), а затем вызывает его каждые две секунды. Объект состояния в примере используется для подсчета количества вызовов делегата. Таймер останавливается при вызове делегата по крайней мере 10 раз.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
private static Timer timer;
static void Main(string[] args)
{
var timerState = new TimerState { Counter = 0 };
timer = new Timer(
callback: new TimerCallback(TimerTask),
state: timerState,
dueTime: 1000,
period: 2000);
while (timerState.Counter <= 10)
{
Task.Delay(1000).Wait();
}
timer.Dispose();
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.");
}
private static void TimerTask(object timerState)
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.");
var state = timerState as TimerState;
Interlocked.Increment(ref state.Counter);
}
class TimerState
{
public int Counter;
}
}
Imports System.Threading
Module Program
Private Timer As Timer
Sub Main(args As String())
Dim StateObj As New TimerState
StateObj.Counter = 0
Timer = New Timer(New TimerCallback(AddressOf TimerTask), StateObj, 1000, 2000)
While StateObj.Counter <= 10
Task.Delay(1000).Wait()
End While
Timer.Dispose()
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: done.")
End Sub
Private Sub TimerTask(ByVal StateObj As Object)
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}: starting a new callback.")
Dim State As TimerState = CType(StateObj, TimerState)
Interlocked.Increment(State.Counter)
End Sub
Private Class TimerState
Public Counter As Integer
End Class
End Module
Дополнительные сведения и примеры см. в статье System.Threading.Timer.
Класс System.Timers.Timer
Другой таймер, который можно использовать в многопоточной среде, — это System.Timers.Timer, который по умолчанию вызывает событие в потоке ThreadPool.
При создании System.Timers.Timer объекта можно указать интервал времени, в котором необходимо вызвать Elapsed событие.
Enabled Используйте свойство, чтобы указать, должен ли таймер вызывать Elapsed событие. Если необходимо, чтобы событие было вызвано только один раз после истечения указанного интервала, задайте Elapsed в значение AutoReset. Значение AutoReset свойства по умолчанию — true
это означает, что Elapsed событие регулярно вызывается через интервал, определенный свойством Interval .
Дополнительные сведения и примеры см. в статье System.Timers.Timer.
Класс System.Threading.PeriodicTimer
Класс System.Threading.PeriodicTimer позволяет ожидать отдельные галочки заданного интервала, выполняя работу после вызова PeriodicTimer.WaitForNextTickAsync.
При создании System.Threading.PeriodicTimer объекта вы задаёте TimeSpan, который определяет интервал времени между каждым тиком таймера. Вместо передачи обратного вызова или настройки обработчика событий, как в предыдущих классах таймера, вы выполняете работу непосредственно в сфере, ожидая WaitForNextTickAsync перемещения таймера на указанный интервал.
Метод WaitForNextTickAsync возвращает ValueTask<bool>
: true
после успешного запуска таймера и false
при отмене таймера вызовом PeriodicTimer.Dispose.
WaitForNextTickAsync при необходимости принимает CancellationToken, что приводит к TaskCanceledException при запросе отмены.
Дополнительные сведения см. в разделе System.Threading.PeriodicTimer.