Namespace Chl2ExO2

. . .

Public class Connection

Как это работает

Class Classl

Namespace Chl2ExO2

Public class Display

Namespace Chl2ExO2

Public class Connection

Namespace Chl2ExO2

Определение событий

Для примера – версия программы немедленной отправки сообщений и создание объекта Connection (соединение), который будет генерировать события объектом Display (вывод).

1.Создать консольное приложение с именем Сh12Ex02 в директории C:\BegCSharp\Chapterl2\.

2.Добавить новый класс Connection в файл Connection. Cs:

using System;

using System.Timers;

{

public delegate void MessageHandler (string messageText);

{

public event MessageHandler Mess age Arrived;

private Timer pollTimer;

public Connection()

{

pollTimer = new Timer (100);

pollTimer.Elapsed += newElapSedEventHandler(CheckForMessage);

}

public void Connect()

{

pollTimer.Start();

}

public void Disconnect()

{

pollTimer.Stop();

}

private void CheckForMessage(object source, E1aPsedEvent Args e )

{

Console.Write(“Checking for new massage.”);

Random random= new Random();

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

{

MessageArrived(“Hello Mum”);

}

}

}

}

3. Добавьте новый класс — Display — в файл Display.cs:

using System;

{

{

public void DisplayMessage(string message)

{

Console.WriteLine( “Message arrived: (0)”, message);

}

}

}

4. Внесите следующие изменения в файл Class1.cs:

using System;

{

{

static void Main(string[] args)

{

Connection myConnection = new Connection () ;

Display myDisplay = new Display () ;

myConnection.MessageArrived +=

new MessageHandler (myDisplay.DisplayMessage);

myConnection.Connect();

Console.ReadLine();

}

}

}

5. Запустите приложение

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

{

private Timer pollTimer;

public Connection()

{

pollTimer = new Timer (100) ;

pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);

}

public void Connect()

{

pollTimer.Start();

}

public void Disconnect()

{

pollTimer.Stop();

}

}

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

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

{

public delegate void MessageHandler (string messageText);

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

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