Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 395
Эндрю Троелсен
public abstract class System.IO.Stream: MarshalByRefObject, IDisposable {
…
public virtual IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state);
public virtual IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state);
public virtual int EndRead(IAsyncResult asyncResult); public virtual void EndWrite(IAsyncResult asyncResult);
}
Работа с асинхронными возможностями типов, производных от System. IO.Stream, аналогична работе с асинхронными делегатами и асинхронными удаленными вызовами методов. Маловероятно, что асинхронный подход может существенно улучшить доступ к файлам, но есть большая вероятность того, что от асинхронной обработки получат выгоду другие потоки (например, использующие сокеты). Так или иначе, следующий пример иллюстрирует подход, в рамках которого вы можете асинхронно взаимодействовать с типом FileStream.
class Program {
static void Main(string[] args) {
Console.WriteLine("Старт первичного потока, ThreadID = {0}", Thread.CurrentThread.GetHashCode());
// Следует использовать этот конструктор, чтобы получить
// FileStream с асинхронным доступом для чтения и записи.
FileStream fs = new FileStream('logfile.txt", FileMode.Append, FileAccess.Write, FileShare.None, 4096, true);
string msg = "это проверка";
byte[] buffer = Encoding.ASCII.GetBytes(msg);
// Начало асинхронной записи.
// По окончании вызывается WriteDone.
// Объект FileStream передается методу обратного вызова,
// как информация состояния.
fs.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(WriteDone), fs);
}
private static void WriteDone(IAsyncResult ar) {
Console.WriteLine("Метод AsyncCallback для ThreadID = {0}", Thread.CurrentThread.GetHashCode());
Stream s = (Stream)ar.AsyncState;
s.EndWrite(ar);
s.Close();
}
}
Единственным заслуживающим внимания моментом (при условии, что вы помните основные особенности использования делегатов!) в этом примере является то, что для разрешения асинхронного поведения типа FileStream вы должны использовать специальный конструктор (который здесь и используется). Последний параметр System.Boolean (если он равен true) информирует объект FileStream о том, что соответствующие операции должны выполняться во вторичном потоке.
Исходный код. Проект AsynсFileStream размещен в подкаталоге, соответствующем главе 16.
Резюме
Эта глава начинается с рассмотрения типов Directory(Info) и File(Info) (а также нескольких новых членов типа File, появившихся в .NET 2.0). Вы узнали о том, что эти классы позволяют работать с физическими файлами или каталогами на жестком диске. Затем был рассмотрен ряд типов (в частности, FileStream), полученных из абстрактного класса Stream. Поскольку типы, производные от Stream, работают с потоком "сырых" байтов, пространство имен System.IO предлагает множество типов ввода-вывода (StreamWriter, StringWriter, BinaryWriter и т.п.), упрощающих процесс.
В процессе обсуждения был также рассмотрен новый тип .NET 2.0 DriveType, вы узнали о том, как контролировать файлы с помощью типа FileSystemWatcher и как взаимодействовать с потоками в асинхронном режиме.