Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 15:

Параллельные операции в .NET

Асинхронный ввод-вывод

Для реализации асинхронного ввода-вывода в .NET предназначен абстрактный класс System.IO.Stream. В этом классе определены абстрактные синхронные методы чтения Read и записи Write, а также реализация асинхронных методов BeginRead, EndRead, BeginWrite и EndWrite. Асинхронные методы реализованы с помощью обращения к синхронным операциям фоновыми потоками пула.

На основе абстрактного класса Stream в .NET Framework реализуются потомки, осуществляющие взаимодействие с разного рода потоками данных. Так, например, System.IO.FileStream реализует операции с файлами, System.IO.MemoryStream предоставляет возможность использования байтового массива в качестве источника или получателя данных, System.IO.BufferedStream является "надстройкой" над другими объектами, производными от System.IO.Stream, и обеспечивает буферизацию запросов чтения и записи. Некоторые классы вне пространства имен Sytem.IO также являются потомками Stream. Так, например, класс System.NET.Sockets.NetworkStream обеспечивает сетевое взаимодействие.

using System;
using System.IO;
namespace TestNamespace {
  class TestApp {
    private const int 	  m_size = 100000000;
    private static byte[]   m_data = new byte [m_size];

    public TestApp()
    {
      int  i;
      for ( i = 0; i < m_size; i++ ) m_data[i] = (byte)i;
    }

    public static void DoneWritting( IAsyncResult state ) {
    }
    static void Main(string[] args) {
      TestApp    	 ta = new TestApp();
      IAsyncResult	 state;
      Stream 		 st = new FileStream(
        "test.dat", FileMode.OpenOrCreate,
        FileAccess.ReadWrite, FileShare.Read, 1, true
      );
      state = st.BeginWrite(
        m_data, 0, m_size,
        new AsyncCallback(DoneWritting), null
      );
      // код в этом месте будет выполняться
      // одновременно с выводом данных
      st.EndWrite( state );
      st.Close();
    }
  }
}

Данный пример демонстрирует использование FileStream для выполнения асинхронной операции записи большого объема данных.

При реализации собственных потомков класса Stream, возможно, будет иметь смысл переопределить не только абстрактные методы Read и Write, но также некоторые базовые (например, BeginRead, ReadByte и др.), универсальная реализация которых может быть неэффективной в конкретном случае.

Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek