Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 128

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 404 >> Следующая


Connection, Объект Timer ИСПОЛЬЗуетСЯ ЭКземплярами этого класса во многом аналогично тому, как он использовался а первом приведенном в данной главе примере, т. е. инициализируется конструктором класса и предоставляет доступ к информации о его состоянии (включен или выключен) через функции Connect О и Disconnect О :

public class Connection (

private Timer pollTimer;

public Connection ()

(

pollTimer = new Timer(100);

pollTimer,Elapsed += new ElapsedEventHandler(CheckForMessagel;

>

public void Connect()

(

pollTimer,Start() ;

)
События

273

public void Disconnect ()

(

polITimer.Stop(};

)

)

Кроме того, в конструкторе регистрируется обработчик событий для события Elapsed — точно так же, как это делалось в первом примере. Метод обработчика— checxForMessageO —будет генерировать событие в среднем один раз на десять вызовов. Но прежде чем перейти к рассмотрению соответствующего кода, следует познакомиться с собственно определением события.

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

namespace Chl2Ex02

{

public delegate void MessageHondler(string meesageText)j

Этот тип делегата, которому присвоено нмя MeesageHandler, определяет сигнатуру функции типа void, обладающей одним параметром типа string. Этот параметр может быть использован для передачи объекту Display сообщения, полученного от объекта Connection.

После описания делегата (либо использования подходящего делегата, описанного ранее) появляется возможность определить собственно событие как член Класса Connection:

public class Connection

<

public event MessageHondler MessageArrived;

Далее событию присваивается имя (в данном случае — нмя MessageArrived), после чего это событие объявляется с помощью ключевого слова event н указывается тип делегата, который необходимо использовать (MeesageHandler, определенный ранее).

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

MessageArrived ('This ia a message.'); I

Если бы делегат был описан как не имеющий параметров, то можно было бы вызвать наступление события проще:

MessageArrived Е > j ¦

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

В данном случае метод checkForMeasage О (проверка, не пришло лн сообщение) имеет следующий вид:
274

Глава 12

private void CheckForMessage(object source, ElapeedEventArgs e)

(

СопвоХе.WriteLine('Checking for new messages.');

Random random = new Random ();

if ((random.Next(9) -=• 0) && (MessageArrived 1= null))

<

MessageArrived!'Hello Hum! ');

)

)

Здесь используется экземпляр объекта класса Random, который описывался в предшествующих главах. Он генерирует случайное число в диапазоне между 0 и 9, и наступление события вызывается только в том случае, если это число равно 0, что должно происходить в 10% случаев. Это позволяет эмулировать опрос соединения на предмет поступления сообщения, которое не обязательно приходит каждый раз при выполнении проверки.

Обратите внимание на то, что здесь используется некоторая дополнительная логика. Наступление события вызывается только в том случае, если значение выражения MessageArrived i= null равняется true. Это выражение, в котором также используется синтаксис делегата, хотя и в несколько необычном виде, означает: “Имеются лн у данного события какие-либо подписчики?”. Если подписчиков не существует, то MessageArrived получает значение null, и в этом случае нет никакого смысла генерировать наступление события.

Класс, ЯВЛЯЮЩИЙСЯ ПОДПИСЧИКОМ ДаННОГО СОбыТИЯ, Называется DiBplay и состоит нз единственного метода DisplayMeesageO, который описывается следующим образом:

public class Display (

public void DisplayMessage(string message)

{

Console.WriteLine!'Message arrived: (0}', meseage)i

)

>

Сигнатура этого метода соответствует сигнатуре, описываемой делегатом данного типа (и являющейся общей, что представляет собой необходимое условие для обработчиков событий во всех классах, отличных от класса, в котором генерируется данное событие), поэтому данный метод может использоваться для реакции на наступление события MessageArrived.

Все, что теперь необходимо сделать в методе Main о,— это инициализировать экземпляры классов Connection и Display н запустить процесс. Код, который для этого нужно использовать, аналогичен коду нз первого примера:
Предыдущая << 1 .. 122 123 124 125 126 127 < 128 > 129 130 131 132 133 134 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.