C# 非同期IO

低速な記憶装置やネットワークに対して読み書きを行う際、同期させて行うならば、他の処理は長い時間待たなければなりません。もし、以下のように非同期で読み書きをすることができれば、読み書きの完了を待たずに他の処理を進めることができます。

public class MyTest
{
  private Stream inputStream;
  private AsyncCallback myCallBack; // デリゲート
  private byte[] buffer; // 読み込んだデータを格納するバッファ
  const int BufferSize = 256;

  public static void Main()
  {
    inputStream = File.OpenRead("myTest.txt"); // 読み込み用ストリームの Open
    buffer = new Byte[BufferSize]; // バッファの確保
    myCallBack = new SyncCallback(this.OnCompletedRead); // コールバック用デリゲートの登録

    inputStream.BeginRead( // 非同期読み込み
      buffer, // 読み込み結果を格納するバッファ
      0, // 読み込みの始点
      buffer.Length, // バッファのサイズ
      myCallBack, // 読み込み完了時のコールバック
      null // 状態を取得するためのオブジェクト
      );

    for( int i = 0; i < 100000; i++ ) Console.WriteLine("i={0}", i);
  }

  void OnCompletedRead(IAsyncResult asyncResult)
  {
    int bytesRead = inputStream.EndRead(asyncResult);
    if( bytesRead > 0 )
    {
      String s = Encoding.ASCII.GetString(buffer, 0, bytesRead); // 文字列に変換
      Console.WriteLine("buffer={0}", s);
      inputStream.BeginRead(buffer, 0, buffer.Length, myCallBack, null); // 残りを再び非同期読み込み
    }
  }
}

出力は、i の値と、buffer の値が入り乱れて表示されるようになります。