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 событие каждые две секунды (2 000 миллисекунд), настраивает обработчик событий для события и запускает таймер. Обработчик событий отображает значение 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.

Если 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 указанное значение в миллисекундах.

Свойства

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 члены этого типа являются потокобезопасными. Потокобезопасная работа с членами экземпляров типа не гарантируется.

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