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

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 266 267 268 269 270 271 < 272 > 273 274 275 276 277 278 .. 404 >> Следующая


Асинхронный доступ к файлам с использованием событий

Другой способ осуществления доступа к файлам в асинхронном режиме включает использование метода, возвращающего сообщение, который позволяет .NET Framework предать приложению информацию о том, что операция завершена,
Работа с файлами

И хотя приложение в этот момент может заниматься чем-либо другим, оно немедленно уведомляется о завершении операции чтения.

Для этого необходимо создать метод, которому будет передаваться объект IAsyncResuit. Этот метод может являться составной частью как текущего класса, так и какого-либо другого. В настоящем примере мы включили его как член самого класса, однако это не является обязательным требованием.

Практикум: асинхронное считывание файлов с использованием событий

1. Создайте новый проект. Выберите пункт меню C# Console Application и назовите его AayncReadEvents.

2. Измените имя класса с classl на AsyncRead.

Программа должна выглядеть следующим образом:

using System;

namespace AsyncReadEvent a

(

III <suiranery>

III Краткое описание класса Claaal.

Ill </sumnary> class AsyncReed (

static void Main<string[] args)

(

П

11 Что сделать: добавить код для запуска приложения

II

)

)

)

3. Включите следующие строки кода в начало файла ciassi. cs:

using System; using System. IQ; using System.Texti

4. В этом примере мы поступим несколько по-другому. Добавьте следующие переменные в класс AsynchRead:

public class AsynchRead

С

byte[] byData; charГ] charData;

5. Включите следующий код конструктора класса AsynchHead

непосредственно вслед за только что определенными переменными;

public AsynchReadО {

byData и new byte[100]; charData = new Char 00];

try '

I

Filestream aFile > new FileStream<'..I../Classl.cs*,FileMode.Open);

System. J yncCallbacJc cb 1 new AsyncCalIback (this. HandleRead) j

System.IAsyncResuit «Result 1 aFile.BeginRead(byData,0,100,cb,"Read Classl.cs*);

} .
584

Глава 20

catch(lOException e)

{ . ' Console.WriteLinef"Ап Ю exception has been thrown I *) j Console.WriteLine(e.ToStringO J >

Console.ReadLine <); return;

)

6. Теперь добавим метод, возвращающий сообщение,— HandieReadO, который был зарегистрирован нами перед этим в методе BepinReadO. Добавьте этот код и произвольное место класса AsynchRead.

private void HandleRead(lAsyncResult ar)

{

Decoder d * Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0J ;

Console.WriteLine('Value of state object for this operation: (0)', ar.AsyncState); ¦

Console.WriteLine(charData); .

)

7. В заключение добавьте приведенный ниже код в метод Main о.

В нем создается новый экземпляр объекта AsynchRead,

что позволяет запустить приложение.

static void Main(string[] args)

(

AsynchRead aClass * new AsynchRead();

for (int x-0;x<:2QO;x++) .

(

Console.WriteLine<x);

)

Console.ReadLine О; returnj ¦

* nicntVartf In-.A+jraRcadfcvciTtj AvyiuH* kIwilIi

П

Щ

7

m

W

tarn

Ш

tB3

ifM

UH

iF utM? olijrct f'sv IVL- . 114- is»n no oil С i ¦ ¦ ¦ :¦ 1 . r ~ os In'j К gi t i: i1 i ocifi‘1 Synt rn.IQt пт i «IЦ: 3 ystcn a и t;

II ¦* ГП ! S'.I Г.С ync fiViHit.l f.u It j\C _

.-mz

//^ tzur-.firtr'j?

U

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

Вы увидите выходной поток, подобный представленному на рисунке слева.

Как это работает — Асинхронное считывание файлов с использованием событий

Этот пример обладает фундаментальными отличиями от предшествующего. В нем метод Main о создает экземпляр объекта classl, а затем продолжает выполнять свою собственную работу — вывод порядковых чисел на консоль; весь смысл этого заключается в том, что теперь этому методу ие приходится отслеживать процедуру считывания, и он может выполнять какие-либо другие действия, совершенно от этой процедуры не зависящие.

Считывание файла в асинхронном режиме запускается в конструкторе класса classl, прн этом в системе регистрируется метод, возвращающий сообщение.
Работа с файлами__________________________________________________________________585

Следующие после открытия объекта Filestream две строки кода выполняют все для этого необходимое:

System.AsyncCallback cb = new AsyncCallback(this.HandleHead);

System.lAsyncReault aResult = aFile,BeginRead(byData,0,100,cb,"Reed Ciassl.cs") ;

В первой строке происходит создание объекта AsyncCallback, который передается в качестве четвертого параметра методу BeginReadu. Для этого создается совершенно новый объект AsyncCallback, передавал адрес метода, который будет принимать объект IAsyncResult в качестве своего единственного параметра. В следующей строке осуществляется вызов метода BeginReado, которому передаются стандартные данные, с которыми мы познакомились ранее, и, кроме того, объект AsyncCallback и строка 'Read ciassl.cs*. Это — задаваемый пользователем объект состояния, который будет использоваться нами позднее — в методе, возвращающем сообщение. Это не имеет никакого смысла для данного сценария, поскольку мы осуществляем только один запрос на асинхронное считывание, но если бы таких запросов было несколько, то нам потребовался бы способ отличать один от другого.
Предыдущая << 1 .. 266 267 268 269 270 271 < 272 > 273 274 275 276 277 278 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

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

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

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

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