1、ファイルを別スレッドで読んで、TextBoxに表示するプログラム。匿名メソッドを使うと、きれいにまとまる。


private void button1_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(@"D:\dir1\test.txt", FileMode.Open );

Byte [] by = new Byte[ fs.Length ];

AsyncCallback ar = new AsyncCallback( delegate( IAsyncResult iar)
{

fs.EndRead(iar);
fs.Dispose();

string str = System.Text.Encoding.UTF8.GetString( by );

textBox1.Invoke( new Action( delegate(){ textBox1.Text = str; } ));

});

fs.BeginRead( by, 0, (int)fs.Length, ar, null );
}

2、1と同じことをする。ファイルを普通にで読んで、TextBoxに表示するプログラム。これは簡単。


private void button1_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(@"D:\dir1\test.txt", FileMode.Open );

Byte [] by = new Byte[ fs.Length ];

fs.Read( by, 0, (int)fs.Length );

fs.Close();

string str = System.Text.Encoding.UTF8.GetString( by );

textBox1.Text = str;
}


3、ファイルを別スレッドで読んで、TextBoxに表示するプログラム。ちょっと前までは、こんな感じだった。


Byte [] _by;
delegate void StringDelegate( string s );

private void button1_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(@"D:\dir1\test.txt", FileMode.Open );

_by = new Byte[ fs.Length ];

fs.BeginRead( _by, 0, (int)fs.Length, new AsyncCallback( ReadCallback ), fs );
}
void ReadCallback( IAsyncResult res )
{
FileStream fs = (FileStream)res.AsyncState;

fs.EndRead( res );
fs.Dispose();

string str = System.Text.Encoding.UTF8.GetString( _by );

textBox1.Invoke( new StringDelegate( SetTextBox1 ), str );
}
void SetTextBox1( string str )
{
textBox1.Text = str;
}


4、3を修正、ファイルを別スレッドで読んで、TextBoxに表示するプログラム。voidのDelegateはActionを使えばいい。さらに匿名メソッドにする。


private void button1_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(@"D:\dir1\test.txt", FileMode.Open );

_by = new Byte[ fs.Length ];

fs.BeginRead( _by, 0, (int)fs.Length, new AsyncCallback( ReadCallback2 ), fs );
}
void ReadCallback2( IAsyncResult res )
{
FileStream fs = (FileStream)res.AsyncState;

fs.EndRead( res );
fs.Dispose();

string s = System.Text.Encoding.UTF8.GetString( _by );

textBox1.Invoke( new Action( delegate(){ textBox1.Text=s;}) );
}


5、AsyncCallback内も匿名メソッドにすれば、1になる。