Таймеры

48

В .NET Framework доступно несколько классов Timer, которые могут применяться для обеспечения вызова методов по истечении определенного промежутка времени. Ниже перечислены все эти классы, указаны пространства имен, к которым они относятся, и кратко описаны функциональные возможности, которыми они обладают:

Пространство имен Описание
System.Threading Класс Timer из пространства имен System.Threading предлагает ключевую функциональность. В его конструкторе можно передавать делегат, который должен вызываться через указываемый интервал времени.
System.Timers Класс Timer из пространства имен System.Timers является компонентом, потому что унаследован от базового класса Component. Благодаря этому, его можно перетаскивать из окна Toolbox (Панель инструментов) в область проектирования серверного приложения, например, Windows-службы. Этот класс Timer использует класс System.Threading.Timer, но вместо делегатов предоставляет механизм на основе событий.
System.Windows.Forms В случае использования классов Timer из пространства имен System.Threading и System.Timers методы обратного вызова или событий инициируются не из вызывающего, а из другого потока. Элементы управления Windows Forms привязываются к потоку создателя. Обратный вызов в этот поток как раз и позволяет осуществлять класс Timer из пространства имен System.Windows.Forms.
System.Web.UI Класс Timer из пространства имен System.Web.UI является расширением Ajax и предназначен для использования с веб-страницами.
System.Windows.Threading Класс DispatcherTimer из пространства имен System.Windows.Threading применяется в WPF-приложениях и выполняется в рамках потока пользовательского интерфейса.

В случае применения класса System.Threading.Timer подлежащий вызову метод может передаваться прямо в первом параметре конструктора. Этот метод должен обязательно удовлетворять требованиям делегата TimerCallback, согласно которым возвращаемым типом должен быть void, а типом параметра — object. Во втором параметре может передаваться любой объект, который затем будет получен с аргументом объекта в методе обратного вызова.

Например, это может быть объект Event, который будет отправлять вызывающему классу соответствующий сигнал. В качестве третьего параметра указывается промежуток времени, через который метод обратного вызова должен вызываться в первый раз, а в качестве четвертого и последнего — промежуток времени, через который метод обратного вызова должен вызываться повторно. Если необходимо, чтобы таймер сработал только один раз, в четвертом параметре должно быть указано значение -1. Для изменения промежутка времени после создания объекта Timer служит метод Change().

Для целей иллюстрации предположим, что имеется консольное приложение, которое выводит текущее время каждую секунду до тех пор, пока пользователь не нажмет клавишу для прекращения приложения:

using System;
using System.Threading;

namespace ConsoleApplication8_Timers
{
    class Program
    {
        static void PrintTime(object state)
        {
            Console.Clear();
            Console.WriteLine("Текущее время:  "+
                DateTime.Now.ToLongTimeString());
        }

        static void Main()
        {
            // Делегат для типа Timer
            TimerCallback timeCB = new TimerCallback(PrintTime);

            Timer time = new Timer(timeCB, null, 0, 1000);
            Console.WriteLine("Нажми чтоб выйти");
            Console.ReadLine();
        }
    }
}
Код таймера

Обратите внимание, что данный метод имеет единственный параметр типа System.Object и возвращает void. Это обязательно, поскольку делегат TimerCallback может вызывать только методы, соответствующие такой сигнатуре. Значение, переданное цели делегата TimerCallback, может представлять какую угодно информацию (в случае примера с электронной почтой этот параметр может представлять имя сервера Microsoft Exchange для взаимодействия в процессе).

Также обратите внимание, что поскольку этот параметр — экземпляр System.Object, ему можно передавать несколько аргументов, используя System.Array или специальный класс/структуру.

Пройди тесты
Лучший чат для C# программистов