Программирование с помощью таймеров обратного вызова

Программирование с помощью таймеров обратного вызова

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

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

class TimePrinter {

 static void PrintTime(object state) {

  Console.WriteLine("Время: {0}", DateTime.Now.ToLongTimeString());

 }

}

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

Следующим шагом является настройка экземпляра делегата TimerCallback и передача его объекту Timer. Кроме делегата TimerCallback, конструктор Timer позволяет указать дополнительную информацию (в виде System.Object) для передачи ее целевому объекту делегата, временной интервал опроса метода и время ожидания (в миллисекундах) до начала первого вызова, например:

static void Main(string[] args) {

 Console.WriteLine("***** Работа с типом Timer ***** ");

 // Создание делегата для типа Timer.

 TimerCallback timeCB = new TimerCallback(PrintTime);

 // Установка параметров таймера.

 Timer t = new Timer(

  timeCB, // Тип делегата TimerCallback.

  null, // Информация для вызываемого метода или null.

  0, // Время ожидания до старта.

  1000); // Интервал между вызовами (в миллисекундах) .

 Console.WriteLine("Нажмите «Enter» для завершения работы…");

 Console.ReadLine();

}

В данном случае метод PrintTime() будет вызываться примерно каждую секунду и методу не передается никакой дополнительной информации. Чтобы передать целевому объекту делегата какую-то информацию, замените значение null второго параметра конструктора подходящим значением (например, "Привет"). Следующая модификация метода PrintTime() использует переданное значение.

static void PrintTime(Object state) {

 Console.WriteLine("Время: {0}, Параметр: {1}", DateTime.Now.ToLongTimeString(), state.ToString());

}

На рис. 14.11 показан соответствующий вывод.

Рис. 14.11. Таймеры за работой

Исходный код. Проект TimerApp размещен в подкаталоге, соответствующем главе 14.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

ГЛАВА 8. Интерфейсы обратного вызова, делегаты и события

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

ГЛАВА 8. Интерфейсы обратного вызова, делегаты и события До этого момента в нашей книге в каждом примере приложении программный код Main() тем или иным способом направлял запросы соответствующим объектам. Но мы пока что не рассматривали возможность обратного обращения


ГЛАВА 12. Отображение типов, динамическое связывание и программирование с помощью атрибутов

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

ГЛАВА 12. Отображение типов, динамическое связывание и программирование с помощью атрибутов Как показано в предыдущей главе, компоновочные блоки являются базовыми элементами установки и среде .NET. С помощью интегрированного обозревателя объектов в Visual Studio 2005 можно


Программирование с помощью атрибутов

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Программирование с помощью атрибутов Как сказано в начале этой главы, одной из задач компилятора .NET является генерирование метаданных для всех определяемых типов и для типов, на которые имеются ссылки. Кроме этих стандартных метаданных, содержащихся в каждом


Обратного пути нет

Из книги Сетевые средства Linux автора Смит Родерик В.

Обратного пути нет Можно было бы ожидать, что допустимо и обратное переопределение атрибута в функцию без аргументов. Но нет. Присваивание - операция применимая к атрибутам, - становится бессмысленной для функций. Предположим, что a - это атрибут класса C, и некоторая


ГЛАВА 12 Сетевое программирование с помощью сокетов Windows

Из книги Ководство автора Лебедев Артём Андреевич

ГЛАВА 12 Сетевое программирование с помощью сокетов Windows Именованные каналы пригодны для организации межпроцессного взаимодействия как в случае процессов, выполняющихся на одной и той же системе, так и в случае процессов, выполняющихся на компьютерах, связанных друг с


1.1.5. Функции обратного вызова

Из книги VBA для чайников автора Каммингс Стив

1.1.5. Функции обратного вызова Прежде чем двигаться дальше, необходимо разобраться с тем, что такое функции обратного вызова (callback functions: этот термин иногда также переводят "функции косвенного вызова"). Эти функции в программе описываются, но обычно не вызываются напрямую,


Конфигурация зоны для обратного преобразования

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Конфигурация зоны для обратного преобразования В листинге указано несколько зон, некоторые из них предназначены для обратного преобразования. Эти зоны позволяют серверу DNS определять доменное имя по IP-адресу. Для того чтобы это стало возможным, необходимо создать


§ 150. От обратного

Из книги Access 2002: Самоучитель автора Дубнов Павел Юрьевич

§ 150. От обратного 8 июля 2008Один из самых эффективных дизайнерских приемов — придумывание неудобных, непонятных и запутанных решений.Например, дизайнеру нужно сделать идеальный вход в магазин. С чего начать? Во-первых, дверь не должна быть видна, лучше всего, если она


Программирование баз данных с помощью Access

Из книги Linux программирование в примерах автора Роббинс Арнольд

Программирование баз данных с помощью Access Прежде чем вы приступите к программированию базы данных в Access, вам следует ознакомиться со всеми отличиями Access от остальных VBA-приложений. Эти различия осложняют перевод программы, созданной с помощью Access, в другое VBA-приложение.*


15.1. Применение указателей функций для их обратного вызова

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

15.1. Применение указателей функций для их обратного вызова ПроблемаПланируется использование некоторой функции func1, которая на этапе выполнения должна вызывать другую функцию func2. Однако по той или иной причине нельзя внутри функции func1 жестко закодировать имя функции


Глава 12 Программирование с помощью процедур VBA

Из книги UNIX — универсальная среда программирования автора Пайк Роб

Глава 12 Программирование с помощью процедур VBA Как уже говорилось, VBA – это объектно-ориентированный язык программирования. В свое время он был разработан специально для записи макросов в Microsoft Excel 5.0. Затем он начал использоваться и другими приложениями Microsoft Office, в


Программирование приложений с помощью VBA

Из книги автора

Программирование приложений с помощью VBA Что может делать пользователь с помощью VBA? Ответ очень прост: все. К сожалению, ни в одной книге нельзя рассмотреть все вероятные сферы программирования, в которых вы найдете применение возможностям VBA. Поэтому ограничимся тем, что


7.14. Создание таймеров

Из книги автора

7.14. Создание таймеров Постановка задачи Требуется многократно выполнять определенную задачу после заданной задержки. Например, вы хотите обновлять вид на экране устройства каждую секунду, пока работает ваше


Глава 6 Программирование с помощью стандартных функций ввода-вывода

Из книги автора

Глава 6 Программирование с помощью стандартных функций ввода-вывода До сих пор мы использовали существующие инструменты, чтобы разрабатывать новые, но сейчас уже достигнут разумный предел в создании новых средств с помощью shell, sed и awk. В этой главе нам предстоит написать