Timer Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет механизм выполнения метода в потоке пула потоков с заданными интервалами. Этот класс не наследуется.
public ref class Timer sealed : IDisposable
public ref class Timer sealed : MarshalByRefObject, System::Threading::ITimer
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, System.Threading.ITimer
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
interface ITimer
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 ITimer
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IAsyncDisposable, IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
- Наследование
-
Timer
- Наследование
- Атрибуты
- Реализации
Примеры
В следующем примере определяется класс, включающий StatusChecker метод, подпись которого совпадает CheckStatus с делегатомTimerCallback. Аргументом stateCheckStatus метода является объект, используемый 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.
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)
Sub TimerCallback(state As Object)
Делегат таймера указывается при создании таймера и не может быть изменен. Метод не выполняется в потоке, который создал таймер; он выполняется в потоке, предоставленном ThreadPool системой.
Tip
.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 метода.
Note
Если вы используете объект Timer, необходимо сохранить ссылку на нее. Как и в случае с любым управляемым объектом, сборка Timer мусора подвергается сборке мусора, если нет ссылок на нее. Тот факт, что по-прежнему Timer активен, не препятствует его сбору.
Note
Системные часы, используемые, являются теми же часами, которые используются GetTickCount, которые не влияют на изменения, внесенные в timeBeginPeriod и timeEndPeriod.
Если таймер больше не нужен, используйте Dispose метод для освобождения ресурсов, удерживаемых таймером. Обратите внимание, что обратные вызовы могут возникать после Dispose() вызова перегрузки метода, так как обратные вызовы таймера для выполнения потоков пула потоков. Вы можете использовать перегрузку Dispose(WaitHandle) метода для ожидания завершения всех обратных вызовов.
Метод обратного вызова, выполняемый таймером, должен быть повторен, так как он вызывается в ThreadPool потоках. Обратный вызов можно выполнять одновременно на двух потоках пула потоков, если интервал таймера меньше времени, необходимого для выполнения обратного вызова, или если все потоки пула потоков используются, а обратный вызов выполняется несколько раз.
Note
System.Threading.Timer — это простой упрощенный таймер, который использует методы обратного вызова и обслуживается потоками пула потоков. Не рекомендуется использовать с Windows Forms, так как обратные вызовы не происходят в потоке пользовательского интерфейса. System.Windows.Forms.Timer является лучшим выбором для использования с Windows Forms. Для функциональных возможностей таймера на основе сервера можно использовать System.Timers.Timer, что вызывает события и имеет дополнительные функции.
Конструкторы
| Имя | Описание |
|---|---|
| Timer(TimerCallback, Object, Int32, Int32) |
Инициализирует новый экземпляр |
| Timer(TimerCallback, Object, Int64, Int64) |
Инициализирует новый экземпляр |
| Timer(TimerCallback, Object, TimeSpan, TimeSpan) |
Инициализирует новый экземпляр |
| Timer(TimerCallback, Object, UInt32, UInt32) |
Инициализирует новый экземпляр |
| Timer(TimerCallback) |
Инициализирует новый экземпляр Timer класса с бесконечным периодом и бесконечным временем выполнения, используя только что созданный Timer объект в качестве объекта состояния. |
Свойства
| Имя | Описание |
|---|---|
| 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) |
Настраивает способ ожидания задач, возвращаемых из асинхронного удаления. |
Применяется к
Потокобезопасность
Этот тип является потокобезопасной.