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