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
Наследование
Реализации

Примеры

В следующем примере создается System.Timers.Timer экземпляр объекта, который запускает событие Timer.Elapsed каждые две секунды (2000 миллисекунд), настраивает обработчик событий для события и запускает таймер. Обработчик событий отображает значение 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...
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, задайте значение AutoReset trueпо умолчанию.

Компонент 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()
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 с элементом пользовательского интерфейса, например формой или элементом управления, не размещая таймер на этом элементе пользовательского интерфейса, назначьте форму или элемент управления, содержащий Timer SynchronizingObject свойство, чтобы событие маршалировало в поток пользовательского интерфейса.

Список значений свойств по умолчанию для экземпляра 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 один раз (false) или неоднократно (true).

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 значение true.

Stop()

Прекращает вызывать событие Elapsed, задавая для свойства Enabled значение false.

ToString()

Возвращает объект String, содержащий имя Component, если оно есть. Этот метод не следует переопределять.

(Унаследовано от Component)

События

Disposed

Возникает при удалении компонента путем вызова метода Dispose().

(Унаследовано от Component)
Elapsed

Происходит по истечении интервала времени.

Применяется к

Потокобезопасность

Все открытые static члены этого типа являются потокобезопасны. Потокобезопасная работа с членами экземпляров типа не гарантируется.

См. также раздел