Составители:
Рубрика:
При реализации собственных потомков класса Stream, возможно, будет
иметь смысл переопределить не только абстрактные методы Read и Write, но
также некоторые базовые (например, BeginRead, ReadByte и др.), универсаль-
ная реализация которых может быть неэффективной в конкретном случае.
7.3.3. Асинхронные процедуры
Для реализации вызова асинхронных процедур в .NET используются
фоновые потоки пула, так же как для обработки асинхронных операций
ввода-вывода. Класс ThreadPool предлагает два способа для вызова асин-
хронных процедур: явное размещение вызовов в очереди
(QueueUserWorkItem) и связывание вызовов с переводом некоторых объек-
тов в свободное состояние (RegisterWaitForSingleObject). Кроме того,
.NET позволяет осуществлять асинхронные вызовы любых процедур с по-
мощью метода BeginInvoke делегатов.
Статический метод ThreadPool.QueueUserWorkItem ставит вызов ука-
занной процедуры в очередь для обработки. Если пул содержит простаива-
ющие потоки, то обработка этой функции начнется немедленно:
using System;
using System.Threading;
namespace TestNamespace {
class GreetingData {
private string m_greeting;
public GreetingData( string text ) { m_greeting = text; }
public void Invoke() { Console.WriteLine( m_greeting ); }
}
class TestApp {
static void AsyncProc( Object arg )
{
GreetingData gd = (GreetingData)arg;
gd.Invoke();
}
public static void Main()
{
GreetingData gd = new GreetingData(“Hello, world!”);
ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncProc), gd);
Thread.Sleep( 1000 );
}
}
}
Разработка параллельных приложений для ОС Windows
257
байтового массива в качестве источника или получателя данных,
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 для выпол-
нения асинхронной операции записи большого объема данных.
256
CIL и системное программирование в Microsoft .NET
256 CIL и системное программирование в Microsoft .NET Разработка параллельных приложений для ОС Windows 257 байтового массива в качестве источника или получателя данных, При реализации собственных потомков класса Stream, возможно, будет System.IO.BufferedStream является «надстройкой» над другими объектами, иметь смысл переопределить не только абстрактные методы Read и Write, но производными от System.IO.Stream, и обеспечивает буферизацию запро- также некоторые базовые (например, BeginRead, ReadByte и др.), универсаль- сов чтения и записи. Некоторые классы вне пространства имен Sytem.IO ная реализация которых может быть неэффективной в конкретном случае. также являются потомками Stream. Так, например, класс System.NET.Sockets.NetworkStream обеспечивает сетевое взаимодействие: 7.3.3. Асинхронные процедуры Для реализации вызова асинхронных процедур в .NET используются using System; фоновые потоки пула, так же как для обработки асинхронных операций using System.IO; ввода-вывода. Класс ThreadPool предлагает два способа для вызова асин- namespace TestNamespace { хронных процедур: явное размещение вызовов в очереди class TestApp { (QueueUserWorkItem) и связывание вызовов с переводом некоторых объек- private const int m_size = 100000000; тов в свободное состояние (RegisterWaitForSingleObject). Кроме того, private static byte[] m_data = new byte [m_size]; .NET позволяет осуществлять асинхронные вызовы любых процедур с по- мощью метода BeginInvoke делегатов. public TestApp() Статический метод ThreadPool.QueueUserWorkItem ставит вызов ука- { занной процедуры в очередь для обработки. Если пул содержит простаива- int i; ющие потоки, то обработка этой функции начнется немедленно: for ( i = 0; i < m_size; i++ ) m_data[i] = (byte)i; } using System; using System.Threading; public static void DoneWritting( IAsyncResult state ) { namespace TestNamespace { } class GreetingData { static void Main(string[] args) { private string m_greeting; TestApp ta = new TestApp(); public GreetingData( string text ) { m_greeting = text; } IAsyncResult state; public void Invoke() { Console.WriteLine( m_greeting ); } Stream st = new FileStream( } “test.dat”, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read, 1, true class TestApp { ); static void AsyncProc( Object arg ) state = st.BeginWrite( { m_data, 0, m_size, GreetingData gd = (GreetingData)arg; new AsyncCallback(DoneWritting), null gd.Invoke(); ); } // код в этом месте будет выполняться // одновременно с выводом данных public static void Main() st.EndWrite( state ); { st.Close(); GreetingData gd = new GreetingData(“Hello, world!”); } ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncProc), gd); } Thread.Sleep( 1000 ); } } Данный пример демонстрирует использование FileStream для выпол- } нения асинхронной операции записи большого объема данных. }
Страницы
- « первая
- ‹ предыдущая
- …
- 133
- 134
- 135
- 136
- 137
- …
- следующая ›
- последняя »