別スレッドからのコントロール操作は InvokeRequired を使う以外に、
BeginInvoke・EndInvoke を使用する方法もあるが、Task があるので書かれないコードのもよう。
だが、一応書き留めておく。
Task クラスが導入されて以降、BeginInvoke を使った
非同期処理は書かなくなった。
ただし、Task クラスを使う場合も
非同期処理やそのコールバックにはデリゲートを使う。
非同期とデリゲート
通常、メソッドを呼び出すとメソッド内の処理が完了するまで
呼び出し元には戻ってこない。( 同期呼び出し:Synchronous Call )
それに対し、
メソッドを呼び出した瞬間に呼び出し元に処理が戻ってくるような
呼び出しのことを非同期呼び出し ( Asynchronous Call ) という。
デリゲートの非同期呼び出しをすると、
デリゲートを介して呼び出されるメソッドの処理と、
呼び出し元の処理が平行して行われる。( マルチスレッド )
デリゲート型を定義すると、 C# のコンパイラによって自動的に
BeginInvoke と EndInvoke というメソッドが生成される。
この BeginInvoke を用いることにより非同期呼び出しを開始し、
EndInvoke を用いることにより非同期処理の終了を待つ事が出来る。
BeginInvoke はデリゲート型の定義時に、
指定した引数と、
System.AsyncCallback デリゲート型の引数、
object 型の引数 をとり、
System.IAsyncResult インターフェース型の値を返す。
EndInvoke はデリゲート型の定義時に
ref または out キーワードを付けた引数、
System.IAsyncResult インターフェース型の引数を持ち、
デリゲートの戻り値と同じ型の戻り値 を持つ。
ex )
delegate int ShowMessage(int n, ref int p, out int q);
IAsyncResult BeginInvoke(
int n, ref int p, out int q,
AsyncCallback callback,
object state);
int EndInvoke(ref int p, out int q, IAsyncResult ar);
out やら ref とかの意味は分からん。
こちらから。
http://ufcpp.net/study/csharp/sp_delegate.html#async
http://ufcpp.net/study/csharp/misc_delegate.html
以上。