Timer Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Создает событие после заданного интервала с возможностью создания повторяющихся событий.
public ref class Timer : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public class Timer : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type Timer = class
inherit Component
interface ISupportInitialize
Public Class Timer
Inherits Component
Implements ISupportInitialize
- Наследование
- Реализации
Примеры
В следующем примере создается экземпляр объекта, который запускает событие Timer.Elapsed каждые две секунды (2000 миллисекунд), настраивает System.Timers.Timer обработчик событий для события и запускает таймер. Обработчик событий отображает значение ElapsedEventArgs.SignalTime свойства при каждом вызове.
using System;
using System.Timers;
public class Example
{
private static System.Timers.Timer aTimer;
public static void Main()
{
SetTimer();
Console.WriteLine("\nPress the Enter key to exit the application...\n");
Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
Console.ReadLine();
aTimer.Stop();
aTimer.Dispose();
Console.WriteLine("Terminating the application...");
}
private static void SetTimer()
{
// Create a timer with a two second interval.
aTimer = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime);
}
}
// The example displays output like the following:
// Press the Enter key to exit the application...
//
// The application started at 09:40:29.068
// The Elapsed event was raised at 09:40:31.084
// The Elapsed event was raised at 09:40:33.100
// The Elapsed event was raised at 09:40:35.100
// The Elapsed event was raised at 09:40:37.116
// The Elapsed event was raised at 09:40:39.116
// The Elapsed event was raised at 09:40:41.117
// The Elapsed event was raised at 09:40:43.132
// The Elapsed event was raised at 09:40:45.133
// The Elapsed event was raised at 09:40:47.148
//
// Terminating the application...
open System
open System.Timers
let onTimedEvent source (e: ElapsedEventArgs) =
printfn $"""The Elapsed event was raised at {e.SignalTime.ToString "HH:mm:ss.fff"}"""
// Create a timer with a two second interval.
let aTimer = new Timer 2000
// Hook up the Elapsed event for the timer.
aTimer.Elapsed.AddHandler onTimedEvent
aTimer.AutoReset <- true
aTimer.Enabled <- true
printfn "\nPress the Enter key to exit the application...\n"
printfn $"""The application started at {DateTime.Now.ToString "HH:mm:ss.fff"}"""
stdin.ReadLine() |> ignore
aTimer.Stop()
aTimer.Dispose()
printfn "Terminating the application..."
// The example displays output like the following:
// Press the Enter key to exit the application...
//
// The application started at 09:40:29.068
// The Elapsed event was raised at 09:40:31.084
// The Elapsed event was raised at 09:40:33.100
// The Elapsed event was raised at 09:40:35.100
// The Elapsed event was raised at 09:40:37.116
// The Elapsed event was raised at 09:40:39.116
// The Elapsed event was raised at 09:40:41.117
// The Elapsed event was raised at 09:40:43.132
// The Elapsed event was raised at 09:40:45.133
// The Elapsed event was raised at 09:40:47.148
//
// Terminating the application...
Imports System.Timers
Public Module Example
Private aTimer As System.Timers.Timer
Public Sub Main()
SetTimer()
Console.WriteLine("{0}Press the Enter key to exit the application...{0}",
vbCrLf)
Console.WriteLine("The application started at {0:HH:mm:ss.fff}",
DateTime.Now)
Console.ReadLine()
aTimer.Stop()
aTimer.Dispose()
Console.WriteLine("Terminating the application...")
End Sub
Private Sub SetTimer()
' Create a timer with a two second interval.
aTimer = New System.Timers.Timer(2000)
' Hook up the Elapsed event for the timer.
AddHandler aTimer.Elapsed, AddressOf OnTimedEvent
aTimer.AutoReset = True
aTimer.Enabled = True
End Sub
' The event handler for the Timer.Elapsed event.
Private Sub OnTimedEvent(source As Object, e As ElapsedEventArgs)
Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}",
e.SignalTime)
End Sub
End Module
' The example displays output like the following:
' Press the Enter key to exit the application...
'
' The application started at 09:40:29.068
' The Elapsed event was raised at 09:40:31.084
' The Elapsed event was raised at 09:40:33.100
' The Elapsed event was raised at 09:40:35.100
' The Elapsed event was raised at 09:40:37.116
' The Elapsed event was raised at 09:40:39.116
' The Elapsed event was raised at 09:40:41.117
' The Elapsed event was raised at 09:40:43.132
' The Elapsed event was raised at 09:40:45.133
' The Elapsed event was raised at 09:40:47.148
'
' Terminating the application...
Комментарии
Компонент Timer — это серверный таймер, который вызывает Elapsed событие в приложении после истечения количества миллисекунда в Interval свойстве. Объект можно настроить Timer для создания события всего один раз или несколько раз с помощью AutoReset свойства. Как правило, объект объявляется на уровне класса, Timer чтобы он оставался в области до тех пор, пока он необходим. Затем можно обработать его Elapsed событие, чтобы обеспечить обычную обработку. Например, предположим, что у вас есть критически важный сервер, который должен работать 24 часа в день, 7 дней в неделю. Вы можете создать службу, которая использует объект для периодической Timer проверки сервера и убедиться, что система работает и работает. Если система не отвечает, служба может попытаться перезапустить сервер или уведомить администратора.
Это важно
Класс Timer недоступен для всех реализаций и версий .NET, таких как .NET Standard 1.6 и более низкие версии. В этих случаях вместо этого можно использовать System.Threading.Timer класс.
Этот тип реализует IDisposable интерфейс. Завершив использование типа, следует избавиться от него напрямую или косвенно. Чтобы удалить тип напрямую, вызовите его Dispose метод в блоке try/catch . Чтобы удалить его косвенно, используйте конструкцию языка, например using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в IDisposable разделе интерфейса.
Класс на основе System.Timers.Timer сервера предназначен для использования с рабочими потоками в многопоточной среде. Таймеры сервера могут перемещаться между потоками для обработки вызываемого Elapsed события, что приводит к большей точности, чем таймеры Windows при возникновении события вовремя.
Компонент System.Timers.Timer вызывает Elapsed событие на основе значения (в миллисекундах) Interval свойства. Это событие можно обрабатывать, чтобы выполнить необходимую обработку. Например, предположим, что у вас есть приложение онлайн-продаж, которое постоянно отправляет заказы на продажу в базу данных. Служба, компилируемая инструкции по доставке, работает в пакете заказов, а не обрабатывает каждый заказ по отдельности. Вы можете использовать пакетную Timer обработку каждые 30 минут.
Это важно
Класс System.Timers.Timer имеет то же разрешение, что и системные часы. Это означает, что Elapsed событие будет запускаться через интервал, определенный разрешением системных часов, если Interval свойство меньше разрешения системных часов. Дополнительные сведения см. в свойстве Interval.
Замечание
Системные часы, используемые, являются теми же часами, которые используются GetTickCount, которые не влияют на изменения, внесенные в timeBeginPeriod и timeEndPeriod.
Если AutoReset задано значение false, System.Timers.Timer объект вызывает Elapsed событие только один раз, после первого Interval истекшего срока действия. Чтобы регулярно вызывать Elapsed событие в интервале, определенном Intervalпараметром , задано значение AutoResettrue, которое является значением по умолчанию.
Компонент Timer перехватывает и подавляет все исключения, создаваемые обработчиками событий для Elapsed события. Это поведение изменяется в будущих выпусках .NET Framework. Обратите внимание, что это не верно для обработчиков событий, которые выполняются асинхронно и включают await оператор (в C#) или Await оператор (в Visual Basic). Исключения, создаваемые в этих обработчиках событий, распространяются обратно в вызывающий поток, как показано в следующем примере. Дополнительные сведения об исключениях, создаваемых в асинхронных методах, см. в разделе "Обработка исключений".
using System;
using System.Threading.Tasks;
using System.Timers;
class Example
{
static void Main()
{
Timer timer = new Timer(1000);
timer.Elapsed += async ( sender, e ) => await HandleTimer();
timer.Start();
Console.Write("Press any key to exit... ");
Console.ReadKey();
}
private static Task HandleTimer()
{
Console.WriteLine("\nHandler not implemented..." );
throw new NotImplementedException();
}
}
// The example displays output like the following:
// Press any key to exit...
// Handler not implemented...
//
// Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
// at Example.HandleTimer()
// at Example.<<Main>b__0>d__2.MoveNext()
// --- End of stack trace from previous location where exception was thrown ---
// at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
// at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
// at System.Threading.ThreadPoolWorkQueue.Dispatch()
open System
open System.Threading.Tasks
open System.Timers
let handleTimer () =
printfn "\nHandler not implemented..."
raise (NotImplementedException()): Task
let timer = new Timer 1000
timer.Elapsed.AddHandler(fun sender e -> task { do! handleTimer () } |> ignore)
timer.Start()
printf "Press any key to exit... "
Console.ReadKey() |> ignore
// The example displays output like the following:
// Press any key to exit...
// Handler not implemented...
//
// Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
// at Example.HandleTimer()
// at Example.<<Main>b__0>d__2.MoveNext()
// --- End of stack trace from previous location where exception was thrown ---
// at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
// at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
// at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
// at System.Threading.ThreadPoolWorkQueue.Dispatch()
Imports System.Threading.Tasks
Imports System.Timers
Public Module Example
Public Sub Main()
Dim timer As New Timer(1000)
AddHandler timer.Elapsed, AddressOf Example.HandleTimer
'timer.Elapsed = Async ( sender, e ) => await HandleTimer()
timer.Start()
Console.Write("Press any key to exit... ")
Console.ReadKey()
End Sub
Private Async Sub HandleTimer(sender As Object, e As EventArgs)
Await Task.Run(Sub()
Console.WriteLine()
Console.WriteLine("Handler not implemented..." )
Throw New NotImplementedException()
End Sub)
End Sub
End Module
' The example displays output like the following:
' Press any key to exit...
' Handler not implemented...
'
' Unhandled Exception: System.NotImplementedException: The method or operation is not implemented.
' at Example._Lambda$__1()
' at System.Threading.Tasks.Task.Execute()
' --- End of stack trace from previous location where exception was thrown ---
' at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
' at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
' at Example.VB$StateMachine_0_HandleTimer.MoveNext()
' --- End of stack trace from previous location where exception was thrown ---
' at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c__DisplayClass2.<ThrowAsync>b__5(Object state)
' at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
' at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
' at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
' at System.Threading.ThreadPoolWorkQueue.Dispatch()
SynchronizingObject Если свойство имеет значениеnull, Elapsed событие вызывается в потокеThreadPool. Если обработка Elapsed события длится дольше Interval, чем, событие может быть снова поднято в другом ThreadPool потоке. В этой ситуации обработчик событий должен быть повторен.
Замечание
Метод обработки событий может выполняться в одном потоке одновременно, когда другой поток вызывает Stop метод или задает Enabled для свойства значение false. Это может привести к Elapsed возникновению события после остановки таймера. В примере кода для Stop метода показан один из способов избежать этого условия гонки.
Даже если SynchronizingObject это не nullтак, Elapsed события могут возникать после Dispose вызова или Stop вызова метода или после Enabled установки falseсвойства, так как сигнал для вызова Elapsed события всегда помещается в очередь для выполнения в потоке пула потоков. Один из способов устранить это состояние гонки — задать флаг, который сообщает обработчику событий для Elapsed события игнорировать последующие события.
Если класс используется System.Timers.Timer с элементом пользовательского интерфейса, например формой или элементом управления, без размещения таймера в этом элементе пользовательского интерфейса, назначьте форму или элемент управления, содержащий TimerSynchronizingObject свойство, чтобы событие маршалировало в поток пользовательского интерфейса.
Список значений свойств по умолчанию для экземпляра Timerсм. в конструкторе Timer .
Подсказка
.NET включает четыре класса с именем Timer, каждый из которых предлагает различные функциональные возможности:
- System.Timers.Timer (в этом разделе): запускает событие через регулярные интервалы. Класс предназначен для использования в качестве серверного компонента или компонента службы в многопоточной среде; Он не имеет пользовательского интерфейса и не отображается во время выполнения.
- System.Threading.Timer: выполняет один метод обратного вызова в потоке пула потоков через регулярные интервалы. Метод обратного вызова определяется при создании экземпляра таймера и не может быть изменен. System.Timers.Timer Как и класс, этот класс предназначен для использования в качестве серверного компонента или компонента службы в многопоточной среде; он не имеет пользовательского интерфейса и не отображается во время выполнения.
- System.Windows.Forms.Timer: компонент Windows Forms, который запускает событие через регулярные интервалы. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточной среде.
- System.Web.UI.Timer (Только .NET Framework): компонент ASP.NET, выполняющий асинхронную или синхронную отправку веб-страницы через регулярный интервал.
Конструкторы
| Имя | Описание |
|---|---|
| Timer() |
Инициализирует новый экземпляр Timer класса и задает все свойства своим начальным значениям. |
| Timer(Double) |
Инициализирует новый экземпляр Timer класса и задает Interval свойству указанное число миллисекунд. |
| Timer(TimeSpan) |
Инициализирует новый экземпляр Timer класса, задав Interval свойство заданному периоду. |
Свойства
| Имя | Описание |
|---|---|
| AutoReset |
Возвращает или задает логическое значение, указывающее, следует ли Timer вызывать Elapsed событие только один раз ( |
| CanRaiseEvents |
Возвращает значение, указывающее, может ли компонент вызвать событие. (Унаследовано от Component) |
| Container |
Возвращает объект IContainer , содержащий Componentобъект . (Унаследовано от Component) |
| DesignMode |
Возвращает значение, указывающее, находится ли текущий Component режим разработки. (Унаследовано от Component) |
| Enabled |
Возвращает или задает значение, указывающее, следует ли Timer вызывать Elapsed событие. |
| Events |
Возвращает список обработчиков событий, подключенных к этому Component. (Унаследовано от Component) |
| Interval |
Возвращает или задает интервал, выраженный в миллисекундах, в которых вызывается Elapsed событие. |
| Site |
Возвращает или задает сайт, который привязывает Timer его к контейнеру в режиме конструктора. |
| SynchronizingObject |
Возвращает или задает объект, используемый для маршалирования вызовов обработчика событий, выдаваемых при истечении интервала. |
Методы
| Имя | Описание |
|---|---|
| BeginInit() |
Начинает инициализацию времени выполнения, Timer которая используется в форме или другом компоненте. |
| Close() |
Освобождает ресурсы, используемые параметром Timer. |
| CreateObjRef(Type) |
Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
| Dispose() |
Освобождает все ресурсы, используемые параметром Component. (Унаследовано от Component) |
| Dispose(Boolean) |
Освобождает все ресурсы, используемые текущим Timer. |
| EndInit() |
Завершает инициализацию времени выполнения, Timer которая используется в форме или другом компоненте. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetLifetimeService() |
Устаревшие..
Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
| GetService(Type) |
Возвращает объект, представляющий службу, предоставляемую Component или ее Container. (Унаследовано от Component) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| InitializeLifetimeService() |
Устаревшие..
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| MemberwiseClone(Boolean) |
Создает неглубокую копию текущего MarshalByRefObject объекта. (Унаследовано от MarshalByRefObject) |
| Start() |
Начинает вызывать Elapsed событие, задав для Enabled |
| Stop() |
Останавливает вызов Elapsed события, задав для Enabled |
| ToString() |
String Возвращает имя, содержащее имя , если таковое Componentимеется. Этот метод не должен быть переопределен. (Унаследовано от Component) |
События
| Имя | Описание |
|---|---|
| Disposed |
Происходит при удалении компонента вызовом Dispose() метода. (Унаследовано от Component) |
| Elapsed |
Происходит при истечении интервала. |
Применяется к
Потокобезопасность
Все общедоступные static члены этого типа являются потокобезопасны. Никакие члены экземпляра не гарантированы как потокобезопасные.