Timer Класс

Определение

Предоставляет механизм для выполнения метода в потоке пула с заданными интервалами. Этот класс не наследуется.

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

Примеры

В следующем примере определяется класс, включающий метод, сигнатура которого совпадает StatusChecker с делегатомTimerCallback.CheckStatus state Аргументом CheckStatus метода является объект, используемый AutoResetEvent для синхронизации потока приложения и потока пула потоков, который выполняет делегат обратного вызова. Класс StatusChecker также включает две переменные состояния:

invokeCount
Указывает количество вызовов метода обратного вызова.

maxCount
Определяет максимальное число вызовов метода обратного вызова.

Поток приложения создает таймер, который ожидает одну секунду, а затем выполняет CheckStatus метод обратного вызова каждые 250 миллисекунд. Затем поток приложения блокируется, пока объект не AutoResetEvent будет сигнализировать. Когда метод обратного CheckStatus вызова выполняется maxCount несколько раз, он вызывает AutoResetEvent.Set метод, чтобы задать состояние AutoResetEvent объекта для сигнала. В первый раз, когда это происходит, поток приложения вызывает Change(Int32, Int32) метод, чтобы метод обратного вызова выполнялся каждые половину секунды. Он снова блокируется до тех пор, пока объект не AutoResetEvent будет сигнализировать. В этом случае таймер уничтожается путем вызова метода Dispose , и приложение завершает работу.

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 выполнить. Подпись делегата TimerCallback :

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

Делегат таймера указывается при создании таймера и не может быть изменен. Метод не выполняется в потоке, который создал таймер; он выполняется в потоке, ThreadPool предоставленном системой.

Совет

.NET включает несколько классов таймера, каждый из которых предлагает различные функциональные возможности:

  • System.Timers.Timer, который вызывает событие и выполняет код в одном или нескольких приемниках событий через регулярные интервалы. Класс предназначен для использования в качестве серверного компонента или компонента службы в многопоточной среде; Он не имеет пользовательского интерфейса и не отображается во время выполнения.
  • System.Threading.Timer, который выполняет один метод обратного вызова в потоке пула потоков через регулярные интервалы. Метод обратного вызова определяется при создании экземпляра таймера и не может быть изменен. System.Timers.Timer Как и класс, этот класс предназначен для использования в качестве серверного компонента или компонента службы в многопоточной среде; он не имеет пользовательского интерфейса и не отображается во время выполнения.
  • System.Windows.Forms.Timer, компонент Windows Forms, который запускает событие и выполняет код в одном или нескольких приемниках событий через регулярные интервалы. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточной среде; он выполняется в потоке пользовательского интерфейса.
  • System.Web.UI.Timer(только платформа .NET Framework), компонент ASP.NET, который выполняет асинхронную или синхронную обратную передачу веб-страниц через регулярный интервал.
  • System.Windows.Threading.DispatcherTimer— таймер, интегрированный Dispatcher в очередь. Этот таймер обрабатывается с указанным приоритетом с заданным интервалом времени.

При создании таймера можно указать время ожидания до первого выполнения метода (время выполнения) и время ожидания между последующими выполнениями (периодом). Класс Timer имеет то же разрешение, что и системные часы. Это означает, что если период меньше разрешения системных часов, делегат будет выполняться через интервалы, TimerCallback определенные разрешением системных часов, что составляет около 15 миллисекунд в системах Windows 7 и Windows 8. Вы можете изменить время и период выполнения или отключить таймер с помощью Change метода.

Примечание

Если вы используете Timerобъект, необходимо сохранить ссылку на нее. Как и в случае с любым управляемым объектом, сборка Timer мусора подлежит сборке мусора, если на нее нет ссылок. Тот факт, что по-прежнему Timer активен, не препятствует его сбору.

Примечание

Используемые системные часы — это те же часы, что и GetTickCount, на которые не влияют изменения, внесенные со временемBeginPeriod и timeEndPeriod.

Если таймер больше не нужен, используйте Dispose метод, чтобы освободить ресурсы, удерживаемые таймером. Обратите внимание, что обратные вызовы могут возникать после Dispose() вызова перегрузки метода, так как обратные вызовы таймера для выполнения потоками пула потоков. Вы можете использовать перегрузку Dispose(WaitHandle) метода, чтобы дождаться завершения всех обратных вызовов.

Метод обратного вызова, выполняемый таймером, должен быть повторен, так как он вызывается в ThreadPool потоках. Обратный вызов может выполняться одновременно в двух потоках пула потоков, если интервал таймера меньше времени, необходимого для выполнения обратного вызова, или если все потоки пула потоков используются и обратный вызов помещается в очередь несколько раз.

Примечание

System.Threading.Timer — это простой упрощенный таймер, который использует методы обратного вызова и обслуживается потоками пула потоков. Не рекомендуется использовать с Windows Forms, так как обратные вызовы не выполняются в потоке пользовательского интерфейса. System.Windows.Forms.Timerявляется лучшим выбором для использования с Windows Forms. Для функций таймера на основе сервера можно использовать System.Timers.Timer, что вызывает события и имеет дополнительные функции.

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

Timer(TimerCallback)

Инициализирует новый экземпляр класса Timer с бесконечным периодом и бесконечным временем действия, используя созданный объект Timer в качестве объекта состояния.

Timer(TimerCallback, Object, Int32, Int32)

Инициализирует новый экземпляр класса Timer, используя указанное 32-разрядное знаковое целое число для задания временного интервала.

Timer(TimerCallback, Object, Int64, Int64)

Инициализирует новый экземпляр класса Timer, используя указанное 64-разрядное знаковое целое число для измерения временных интервалов.

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Инициализирует новый экземпляр класса Timer, используя значения объекта TimeSpan для измерения временных интервалов.

Timer(TimerCallback, Object, UInt32, UInt32)

Инициализирует новый экземпляр класса Timer, используя указанное 32-разрядное незнаковое целое число для измерения временных интервалов.

Свойства

ActiveCount

Возвращает число активных сейчас таймеров. Активный таймер — это таймер, который зарегистрирован для срабатывания в определенный момент в будущем и пока не отменен.

Методы

Change(Int32, Int32)

Меняет время запуска и интервал между вызовами метода таймера, используя 32-разрядные знаковые целые числа для измерения временных интервалов.

Change(Int64, Int64)

Меняет время запуска и интервал между вызовами метода таймера, используя 64-разрядные знаковые целые числа для измерения временных интервалов.

Change(TimeSpan, TimeSpan)

Меняет время запуска и интервал межу вызовами метода таймера, используя значения объекта TimeSpan для измерения временных интервалов.

Change(UInt32, UInt32)

Меняет время запуска и интервал между вызовами метода таймера, используя 32-разрядные целые числа без знака для измерения временных интервалов.

CreateObjRef(Type)

Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

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

Освобождает все ресурсы, используемые экземпляром класса Timer.

Dispose(WaitHandle)

Освобождает все ресурсы, используемые текущим экземпляром класса Timer и передает сигнал, когда таймер удаляется.

DisposeAsync()

Освобождает все ресурсы, используемые экземпляром класса Timer.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

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

Позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как он будет уничтожен во время сборки мусора.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Является устаревшей.

Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.

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

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

(Унаследовано от Object)
InitializeLifetimeService()
Является устаревшей.

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

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

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неполную копию текущего объекта MarshalByRefObject.

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

Возвращает строку, представляющую текущий объект.

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

Методы расширения

ConfigureAwait(IAsyncDisposable, Boolean)

Настраивает способ выполнения ожиданий для задач, возвращаемых из асинхронного высвобождаемого объекта.

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

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

Данный тип потокобезопасен.

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