Timer Timer Timer Timer Class

Определение

Предоставляет механизм для выполнения метода в потоке пула с заданными интервалами.Provides a mechanism for executing a method on a thread pool thread at specified intervals. Этот класс не наследуется.This class cannot be inherited.

public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Наследование
Атрибуты
Реализации

Примеры

В следующем примере определяется StatusChecker класс, который включает в себя CheckStatus метод, сигнатура которого совпадает с как TimerCallback делегировать.The following example defines a StatusChecker class that includes a CheckStatus method whose signature is the same as the TimerCallback delegate. state Аргумент CheckStatus метод AutoResetEvent объект, используемый для синхронизации потока приложения и пула потоков, который выполняет делегат обратного вызова.The state argument of the CheckStatus method is an AutoResetEvent object that is used to synchronize the application thread and the thread pool thread that executes the callback delegate. StatusChecker Класс также включает две переменные состояния:The StatusChecker class also includes two state variables:

invokeCount
Указывает, сколько раз был вызван метод обратного вызова.Indicates the number of times the callback method has been invoked.

maxCount
Определяет максимальное количество раз, когда должен быть вызван метод обратного вызова.Determines the maximum number of times the callback method should be invoked.

Поток приложения создает таймер, который ожидает в течение одной секунды, а затем выполняет CheckStatus метод обратного вызова каждые 250 миллисекунд.The application thread creates the timer, which waits one second and then executes the CheckStatus callback method every 250 milliseconds. Поток приложения блокируется до AutoResetEvent объект переводится в сигнальное состояние.The application thread then blocks until the AutoResetEvent object is signaled. Когда CheckStatus выполнении метода обратного вызова maxCount раз, он вызывает AutoResetEvent.Set метод для задания состояния AutoResetEvent объект сигнальным.When the CheckStatus callback method executes maxCount times, it calls the AutoResetEvent.Set method to set the state of the AutoResetEvent object to signaled. Первый раз, в этом случае поток приложения вызывает Change(Int32, Int32) метод таким образом, метод обратного вызова теперь выполняется каждые полсекунды.The first time this happens, the application thread calls the Change(Int32, Int32) method so that the callback method now executes every half second. Он снова блокируется до AutoResetEvent объект переводится в сигнальное состояние.It once again blocks until the AutoResetEvent object is signaled. В этом случае таймер уничтожается, вызвав его Dispose метод и приложение завершается.When this happens, the timer is destroyed by calling its Dispose method, and the application terminates.

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    int invokeCount, maxCount;

public:
    StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    void CheckStatus(Object^ stateInfo)
    {
        AutoResetEvent^ autoEvent = dynamic_cast<AutoResetEvent^>(stateInfo);
        Console::WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.",
                           DateTime::Now, ++invokeCount);

        if (invokeCount == maxCount) {
            // Reset the counter and signal the waiting thread.
            invokeCount  = 0;
            autoEvent->Set();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        AutoResetEvent^ autoEvent = gcnew AutoResetEvent(false);

        StatusChecker^ statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew TimerCallback(statusChecker, &StatusChecker::CheckStatus);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console::WriteLine("{0:h:mm:ss.fff} Creating timer.\n",
                           DateTime::Now);
        Timer^ stateTimer = gcnew Timer(tcb, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent->WaitOne(5000, false);
        stateTimer->Change(0, 500);
        Console::WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent->WaitOne(5000, false);
        stateTimer->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        var autoEvent = new AutoResetEvent(false);
        
        var statusChecker = new StatusChecker(10);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", 
                          DateTime.Now);
        var stateTimer = new Timer(statusChecker.CheckStatus, 
                                   autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne();
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne();
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    private int invokeCount;
    private int  maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", 
            DateTime.Now.ToString("h:mm:ss.fff"), 
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal the waiting thread.
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Use an AutoResetEvent to signal the timeout threshold in the
        ' timer callback has been reached.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create a timer that invokes CheckStatus after one second, 
        ' and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf, 
                          DateTime.Now)
        Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus, 
                                    autoEvent, 1000, 250)

        ' When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne()
        stateTimer.Change(0, 500)
        Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)

        ' When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne()
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    End Sub
End Module

Public Class StatusChecker
    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' The timer callback method.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.", 
                          DateTime.Now, invokeCount)
        If invokeCount = maxCount Then
            ' Reset the counter and signal the waiting thread.
            invokeCount = 0
            autoEvent.Set()
        End If
    End Sub
End Class
' The example displays output like the following:
'       11:59:54.202 Creating timer.
'       
'       11:59:55.217 Checking status  1.
'       11:59:55.466 Checking status  2.
'       11:59:55.716 Checking status  3.
'       11:59:55.968 Checking status  4.
'       11:59:56.218 Checking status  5.
'       11:59:56.470 Checking status  6.
'       11:59:56.722 Checking status  7.
'       11:59:56.972 Checking status  8.
'       11:59:57.223 Checking status  9.
'       11:59:57.473 Checking status 10.
'       
'       Changing period to .5 seconds.
'       
'       11:59:57.474 Checking status  1.
'       11:59:57.976 Checking status  2.
'       11:59:58.476 Checking status  3.
'       11:59:58.977 Checking status  4.
'       11:59:59.477 Checking status  5.
'       11:59:59.977 Checking status  6.
'       12:00:00.478 Checking status  7.
'       12:00:00.980 Checking status  8.
'       12:00:01.481 Checking status  9.
'       12:00:01.981 Checking status 10.
'       
'       Destroying timer.

Комментарии

Используйте TimerCallback делегат для указания метода, который необходимо Timer для выполнения.Use a TimerCallback delegate to specify the method you want the Timer to execute. Подпись TimerCallback делегат:The signature of the TimerCallback delegate is:

void TimerCallback(Object state)  
void TimerCallback(Object state)  
Sub TimerCallback(state As Object)  

Делегат таймера указывается в том случае, если таймер создается и его нельзя изменить.The timer delegate is specified when the timer is constructed, and cannot be changed. Метод не выполняется в потоке, создавшем таймер; он выполняет в ThreadPool потока, предоставленное системой.The method does not execute on the thread that created the timer; it executes on a ThreadPool thread supplied by the system.

Совет

.NET включает в себя четыре класса с именем Timer, каждый из который предлагает различные функциональные возможности:.NET includes four classes named Timer, each of which offers different functionality:

  • System.Timers.Timer, который запускает событие и выполняет код в одном или приемники несколько событий с регулярными интервалами.System.Timers.Timer, which fires an event and executes the code in one or more event sinks at regular intervals. Класс предназначен для использования в качестве сервера под управлением или компонента службы в многопоточной среде; он нет пользовательского интерфейса и не отображается во время выполнения.The class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Threading.Timer, который выполняет метод одного ответного вызова пула потоков с регулярными интервалами.System.Threading.Timer, which executes a single callback method on a thread pool thread at regular intervals. Метод обратного вызова определяется в том случае, когда таймер создается и не может быть изменено.The callback method is defined when the timer is instantiated and cannot be changed. Как и System.Timers.Timer класса, этот класс предназначен для использования в качестве компонента server или службы в многопоточной среде; у него отсутствует интерфейс пользователя, который не отображается во время выполнения.Like the System.Timers.Timer class, this class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Windows.Forms.Timer (.NET framework только), компонент Windows Forms, который запускает событие и выполняет код в один или несколько приемников событий с регулярными интервалами.System.Windows.Forms.Timer (.NET Framework only), a Windows Forms component that fires an event and executes the code in one or more event sinks at regular intervals. Компонент, у него отсутствует интерфейс пользователя и предназначен для использования в среде однопоточный; он выполняется в потоке пользовательского интерфейса.The component has no user interface and is designed for use in a single-threaded environment; it executes on the UI thread.
  • System.Web.UI.Timer (.NET framework только), компонент ASP.NET, выполняющий обратную передачу асинхронный или синхронный веб-страницы с регулярным интервалом.System.Web.UI.Timer (.NET Framework only), an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.

При создании таймера, можно указать время ожидания перед первым выполнением метода (ожидаемое время) и время ожидания между последовательными вызовами (период).When you create a timer, you can specify an amount of time to wait before the first execution of the method (due time), and an amount of time to wait between subsequent executions (period). Timer Класс имеет тем же разрешением, что системные часы.The Timer class has the same resolution as the system clock. Это означает, что если период меньше, чем разрешение системных часов, TimerCallback делегат будет выполняться через интервалы, определенные путем разрешения системных часов, который составляет приблизительно 15 миллисекунд в системах Windows 7 и Windows 8.This means that if the period is less than the resolution of the system clock, the TimerCallback delegate will execute at intervals defined by the resolution of the system clock, which is approximately 15 milliseconds on Windows 7 and Windows 8 systems. Вы можете изменить из-за времени и период, а также отключать таймер, с помощью Change метод.You can change the due time and period, or disable the timer, by using the Change method.

Примечание

До тех пор, пока вы используете Timer, необходимо хранить ссылку на него.As long as you are using a Timer, you must keep a reference to it. Как и для любого управляемого объекта Timer становятся подвергаются сборке мусора, когда на него нет ссылок.As with any managed object, a Timer is subject to garbage collection when there are no references to it. Тот факт, Timer — это все еще активен препятствует его сбора.The fact that a Timer is still active does not prevent it from being collected.

Когда таймер не нужны, используйте Dispose метод, чтобы освободить ресурсы, удерживаемые таймера.When a timer is no longer needed, use the Dispose method to free the resources held by the timer. Обратите внимание, что обратные вызовы могут возникать после Dispose() перегруженный метод был вызван, так как таймер ставит в очередь обратные вызовы для выполнения по потокам пулов потоков.Note that callbacks can occur after the Dispose() method overload has been called, because the timer queues callbacks for execution by thread pool threads. Можно использовать Dispose(WaitHandle) перегруженный метод для ожидания до завершения всех ответных вызовов.You can use the Dispose(WaitHandle) method overload to wait until all callbacks have completed.

Метод обратного вызова, кем таймера должен быть реентерабельным, так как он вызывается для ThreadPool потоков.The callback method executed by the timer should be reentrant, because it is called on ThreadPool threads. Обратный вызов может выполняться одновременно в двух потоках пула потоков, если интервал таймера меньше, чем время, необходимое для выполнения обратного вызова, или в том случае, если используются все потоки пула потоков и обратный вызов помещается в очередь несколько раз.The callback can be executed simultaneously on two thread pool threads if the timer interval is less than the time required to execute the callback, or if all thread pool threads are in use and the callback is queued multiple times.

Примечание

System.Threading.Timer представляет собой упрощенный таймер, который использует методы обратного вызова и обслуживается из пула потоков.System.Threading.Timer is a simple, lightweight timer that uses callback methods and is served by thread pool threads. Не рекомендуется для использования с Windows Forms, поскольку обратные вызовы не происходят в потоке пользовательского интерфейса.It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread. System.Windows.Forms.Timer не лучшим выбором для работы с Windows Forms.System.Windows.Forms.Timer is a better choice for use with Windows Forms. Для функции таймера на основе сервера, можно использовать System.Timers.Timer, который вызывает события и предоставляет дополнительные возможности.For server-based timer functionality, you might consider using System.Timers.Timer, which raises events and has additional features.

Конструкторы

Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback)

Инициализирует новый экземпляр класса Timer с бесконечным периодом и бесконечным временем действия, используя только что созданный Timer объект в качестве объекта состояния.Initializes a new instance of the Timer class with an infinite period and an infinite due time, using the newly created Timer object as the state object.

Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32)

Инициализирует новый экземпляр класса Timer с помощью 32-разрядное целое число со знаком для указания интервала времени.Initializes a new instance of the Timer class, using a 32-bit signed integer to specify the time interval.

Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64)

Инициализирует новый экземпляр класса Timer с помощью 64-разрядных целых чисел со знаком для измерения временных интервалов.Initializes a new instance of the Timer class, using 64-bit signed integers to measure time intervals.

Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Инициализирует новый экземпляр класса Timer с помощью TimeSpan значения для измерения временных интервалов.Initializes a new instance of the Timer class, using TimeSpan values to measure time intervals.

Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32)

Инициализирует новый экземпляр класса Timer с помощью 32-разрядных целых беззнаковых чисел для измерения временных интервалов.Initializes a new instance of the Timer class, using 32-bit unsigned integers to measure time intervals.

Методы

Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32)

Меняет время запуска и интервал между вызовами метода таймера, используя 32-разрядные знаковые целые числа для измерения временных интервалов.Changes the start time and the interval between method invocations for a timer, using 32-bit signed integers to measure time intervals.

Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64)

Меняет время запуска и интервал между вызовами метода таймера, используя 64-разрядные знаковые целые числа для измерения временных интервалов.Changes the start time and the interval between method invocations for a timer, using 64-bit signed integers to measure time intervals.

Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan)

Меняет время запуска и интервал между вызовами метода таймера, используя TimeSpan значения для измерения временных интервалов.Changes the start time and the interval between method invocations for a timer, using TimeSpan values to measure time intervals.

Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32)

Меняет время запуска и интервал между вызовами метода таймера, используя 32-разрядные целые числа без знака для измерения временных интервалов.Changes the start time and the interval between method invocations for a timer, using 32-bit unsigned integers to measure time intervals.

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type)

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Inherited from MarshalByRefObject)
Dispose() Dispose() Dispose() Dispose()

Освобождает все ресурсы, используемые текущим экземпляром Timer.Releases all resources used by the current instance of Timer.

Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle)

Освобождает все ресурсы, используемые текущим экземпляром Timer и передает сигнал, когда таймер удаляется.Releases all resources used by the current instance of Timer and signals when the timer has been disposed of.

DisposeAsync() DisposeAsync() DisposeAsync() DisposeAsync()
Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Inherited from Object)
Finalize() Finalize() Finalize() Finalize()

Позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как он будет уничтожен во время сборки мусора.Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Inherited from Object)
GetLifetimeService() GetLifetimeService() GetLifetimeService() GetLifetimeService()

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
GetType() GetType() GetType() GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Inherited from Object)
InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService()

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.Obtains a lifetime service object to control the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean)

Создает неполную копию текущего объекта MarshalByRefObject.Creates a shallow copy of the current MarshalByRefObject object.

(Inherited from MarshalByRefObject)
ToString() ToString() ToString() ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Inherited from Object)

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

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

Данный тип потокобезопасен.This type is thread safe.

Дополнительно