Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 135 стр.

UptoLike

При реализации собственных потомков класса 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 для выпол-                      }
нения асинхронной операции записи большого объема данных.                            }