Рабочим названием платформы .NET было |
Параллельные операции в .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 и др.), универсальная реализация которых может быть неэффективной в конкретном случае.