Прочитать на английском

Поделиться через


Timer Класс

Определение

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

[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : IDisposable
public sealed class Timer : MarshalByRefObject, IAsyncDisposable, IDisposable
public sealed class Timer : MarshalByRefObject, System.Threading.ITimer
public sealed class Timer : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
Наследование
Timer
Наследование
Атрибуты
Реализации

Примеры

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

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

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

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

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.

Комментарии

Используйте делегат TimerCallback, чтобы указать метод, который требуется выполнить Timer. Подпись делегата TimerCallback:

void TimerCallback(Object state)

Делегат таймера указывается при создании таймера и не может быть изменен. Метод не выполняется в потоке, который создал таймер; он выполняется в потоке 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, которые не влияют на изменения, внесенные с timeBeginPeriod и 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)

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

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

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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

Этот тип является потокобезопасной.

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