|
Программирование >> Программирование с использованием ajax
Обработка событий Как уже рассказывалось выше, для обработки события на него нужно подписываться, предоставляя функцию - обработчик событий, возвращаемый тип и параметры которой должны совпадать с возвращаемым типом и параметрами делегата, закрепленного для применения с этим событием. В следующем практическом занятии демонстрируется пример, в котором простой объект таймера используется для генерации событий, что приводит к вызову функции-обработчика. ИЕ!!!?!! Обработка событий 1. Создайте новое консольное приложение по имени СЫЗЕхО! и сохраните его в каталоге С;\BegVCSharp\Chapterl3. 2. Измените код в его файле Program, cs следующим образом: using System; using System.Collections .Generic-using System.Linq; using System.Text; using System.Timers; namespace ChlSExOl { class Program { static int counter = 0; static string displayString = This string will appear one letter at a time. ; Строка, которая будет отображаться по одной букве за раз static void Main(string [ ] args) Timer myTimer = new Timer (100) ; myTimer. Elapsed += new ElapsedEventHandler (WriteChar) ; myTimer.Start(); Console.ReadKey(); static void WriteChar (object source, ElapsedEventArgs e) { Console.Write(displayString[counter++ % displayString.Length]); 3. Запустите приложение (после запуска нажатие любой клавиши приводит к завершению приложения). Через некоторое время на экране появится результат, показанный на рис. 13.5. Рис. 13.5. Приложение ChiЗЕх01 в действии Описание полученных результатов Объект, который используется для генерации событий, представляет собой экземпляр класса System. Timers. Timer. Инициализируется он с указанием временного интервала (в миллисекундах). Когда он запускается с помощью метода Start (), начинают генерироваться события через соответствующие заданному промежутки времени. В Main () объект Timer инициализируется с временным промежутком, составляющим 100 миллисекунд, а это означает, что при запуске он будет генерировать события 10 раз в секунду: static void Main(string [ ] args) { Timer myTimer = new Timer(lOO); Объект Timer инициирует событие Elapsed, и обработчик для этого события должен обязательно иметь такой же возвращаемый тип и параметры, как тип-делегат System. Timers .ElapsedEventHandler, который является одним из стандартных делегатов, поставляемых с .NET Framework. Возвращаемый тип и параметры этого делегата выглядят следующим образом: void functionName(object source, ElapsedEventArgs e); Объект Timer отправляет ссылку на самого себя в первом параметре и экземпляр объекта ElapsedEventArgs во втором параметре. Эти параметры вполне безопасно проигнорировать; более подробно они будут рассматриваться позже в главе. Для этого в коде присутствует подходящий метод: static void WriteChar(object source, ElapsedEventArgs e) { Console.Write(displayString[counter++ % displayString.Length]); Этот метод использует два статических поля Class 1 - counter и displayString - для отображения одного символа. При каждом вызове этого метода отображается очередной символ. Следующим шагом является подключение этого обработчика к событию, т.е. подписку на него. Выполняется оно путем применения операции += для добавления обработчика в событие в виде нового экземпляра делегата, инициализируемого с методом обработки событий WriteChar: static void Main(string [ ] args) { Timer myTimer = new Timer(lOO); myTimer.Elapsed += new ElapsedEventHandler(WriteChar); Данная команда (в которой используется немного странно выглядящий синтаксис, являющийся специфическим синтаксисом делегатов) добавляет обработчик в список, который будет вызываться при генерации события Elapsed. В этот список можно добавлять сколько угодно обработчиков, главное, чтобы все они отвечали требуемым критериям. Каждый из этих обработчиков будет вызываться при генерации события по очереди. Все, что остается для функции Main () - это запуск таймера: myTimer.start (); Нельзя, чтобы работа приложения завершалась до того, как будут обработаны те или иные события, поэтому функция Main () помещается в режим ожидания. Простейшим способом для этого является запрос ввода пользователя, поскольку такая команда не будет завершать процесс обработки до тех пор, пока пользователь не нажмет какую-нибудь клавишу: Console.ReadKey О; Хотя процесс обработки в Main () на этом этапе фактически прекращен, процесс обработки в объекте Timer продолжается. Когда он генерирует события, он вызывает метод WriteChar О, который работает параллельно с оператором Console. ReadLine (). Определение событий Теперь пришла пора научиться определять и использовать свои собственные события. В следующем практическом занятии демонстрируется пример реализации сценария мгновенного обмена сообщениями, приведенного ранее в этой главе, с созданием объекта Connection, генерирующего события, за обработку которых отвечает объект Display. 1. Создайте новое консольное приложение по имени Chl3Ex02 и сохраните его в каталоге С:\BegVCSharp\Chapterl3. 2. Добавьте в него новый класс Connection и измените код в файле Connection.cs следующим образом: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; namespace Chl3Ex02 { public delegate void MessageHandler (string messageText) ; public class Connection public event MessageHandler MessageArrived; 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 () pollTimer.Stop(); private static Random random = new Random () ; private void CheckForMessage (object source, ElapsedEventArgs e) Console.WriteLine ( Checking for new messages. ) ; Проверка поступления новых сообщений
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |