using System;
using System.IO;
using System.Threading;
namespace ConsoleApplication1
{
class Demo
{
public void UserInput() // диалог с пользователем
{
string s;
do
{
Console.WriteLine("Введите строку. Enter для завершения");
s = Console.ReadLine();
} while (s.Length!= 0);
}
public void OnCompletedRead(IAsyncResult ar) // 1
{
int bytes = f.EndRead(ar);
Console.WnteLine("Считано " + bytes);
}
public void AsyncRead()
{
f = new FileStream("D:\verybigfile", FileMode.Open,
FileAccess.Read.FileShare.Read.buf.Length, true); // 2
callback = new AsyncCallback(OnCompletedRead); // 3
f.BeginRead(buf, 0, buf.Length, callback, null); // 4 }
FileStream f;
byte[] buf = new byte[66666666];
AsyncCallback callback;
}
class Program
{
static void Main()
{
Demo d = new Demo();
d.AsyncRead();
d.Userlnput();
}
}
}
}
Для удобства восприятия операции чтения из файла и диалога с пользователем оформлены в отдельный класс Demo.
Метод OnCompletedRead (оператор 1) должен получать один параметр стандартного типа IAsyncResult, содержащий сведения о завершении операции, которые передаются в метод EndRead.
файл открывается в асинхронном режиме, об этом говорит значение true последнего параметра конструктора (оператор 2). В операторе 3 создается экземпляр стандартного делегата AsyncCallback, который инициализируется методом
|
|
OnCompletedRead.
С помощью этого делегата метод OnCompletedRead передается в метод BeginRead (оператор 4), который создает отдельный поток, начинает асинхронный ввод и возвращает управление в вызвавший поток. Обратный вызов метода OnCompletedRead происходит при завершении операции ввода. При достаточно длинном файле verybigfile можно убедиться, что приглашение к вводу в методе User Input выдается раньше, чем сообщение о завершении операции ввода из метода OnCompletedRead.
ПРИМЕЧАНИЕ
Пример, приведенный в листинге 11.2, максимально упрощен для демонстрации методов BeginRead и EndRead, поэтому в нем нет необходимых в любой программе проверок наличия файла, успешности считывания и т. д.