Программирование >>  Программирование с использованием ajax 

1 ... 119 120 121 [ 122 ] 123 124 125 ... 396


3. Добавьте новый класс Display и измените его код в файле Display, cs следующим образом:

namespace Chl3Ex02 {

public class Display {

public void DisplayMessage(string message) {

Console.WriteLine( Message arrived: {0} , message);

Поступило новое сообщение

4. Измените код в файле Program, cs показанным ниже образом:

static void Main(string[] args) (

Connection myConnection = new Connect ion () ; Display myDisplay = new Display () ; myConnection.MessageArrived +=

new MessageHandler (myDisplay.DisplayMessage); myConnection.Connect (); Console.ReadKey();

5. Запустите приложение. На рис. 13.6 показан результат, который должен получиться.

I fM€: /C:/B€gVCSharp;Chapt#r13/Ch13Ex02/...


Рис. 13.6. Приложение Chl3Ex02 в действии

if ((random.Next(9) = 0) && (MessageArrived != null)) {

MessageArrived ( Hello Mum! ) ;



Описание полученных результатов

Большую часть работы в этом приложении выполняет класс Connection. Экземпляры этого класса применяют объект Timer, во многом подобный тому, что показывался в первом примере этой главы, инициализируя его в конструкторе класса и предоставляя доступ к его состоянию (информации о том, включен он или выключен) через методы Connect () и Disconnect ():

public class Connection {

private Timer pollTimer; public Connection 0

pollTimer = new Timer(100);

pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage); public void Connect 0

pollTimer.Start 0; public void Disconnect 0 pollTimer.Stop 0;

Еще в конструкторе регистрируется обработчик для события Elapsed, точно так же, как это делалось в первом примере. Метод этого обработчика - CheckForMessage () - предусматривает генерацию события в среднем один раз для каждых 10 раз его вызова. Его код еще будет поясняться, но сначала не помешает рассмотреть определение самого события.

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

namespace Chl3Ex02 {

public delegate void MessageHandler(string messageText);

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

public class Connection {

public event MessageHandler MessageArrived;

Делается это просто выбором имени для события (каковым здесь является MessageAarived) и его объявлением с использованием ключевого слова event и указанием применяемого с ним типа-делегата (в данном случае - определенного ранее



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

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

Класс, который будет подписываться на событие, называется Display и содержит единственный метод DisplayMessage (), определенный следующим образом:

public class Display {

public void DisplayMessage(string message) {

Console.WriteLine( Message arrived: {0} , message);

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

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

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

MessageArrived ( This is а message. );

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

MessageArrivedО;

В качестве альтернативного варианта, делегат мог еще быть определен и с ботхь-шим числом параметров, что тогда бы потребовало написания большего количества кода для генерации события. Что касается метода CheckForMessage (), то его код выглядит так:

private static Random random = new Random();

private void CheckForMessage(object source, ElapsedEventArgs e) {

Console.WriteLine( Checking for new messages. );

if ( (random.Next(9) == 0) && (MessageArrived != null))

MessageArrived( Hello Mum! );



1 ... 119 120 121 [ 122 ] 123 124 125 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика