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 の値が入り乱れて表示されるようになります。