どうしても C# の Invoke, delegate の解説記事がうまく理解できないので、ゆっくり咀嚼しつつ自分なりの抽象化を試します。
ちゃんと C# を勉強しないまま使わざるを得ないので、試行錯誤の過程でこういうことになるのです...
delegate とは
関数ポインタ型 のようなもの
なので実体を作らないと使えない。
実体を作るときのコンストラクタには、実行したい関数のポインタを指定する。(つまり関数名を書く)
delegate の宣言の形は
delegate 実行したい関数の戻り値型 デリゲートの名前( 実行したい関数と同じ引数 )
という感じ。ただ戻り値がどこに戻るのかよくわからない。つまり受け取り方がよくわからない。むむむ。後で勉強しよう。
Invoke とは
関数ポインタを別スレッドに投げること。
コントロールのメソッドである Invoke は、そのコントロールの属するスレッドで投げられた関数を実行する。
引数には
- デリゲートの実体
- 実行したい関数への引数
を渡す。実行したい関数への引数がややこしいが、複数個の引数を羅列した object 配列を塊として渡す。
塊の作り方は
new object[]{ param1, param2, ...}
雛形
delegate void DELEGATENAME( T1 param1, T2 param2 );
void FUNCTIONNAME( T1 param1, T2 param2 )
{
}
// 別のスレッドで実行されている関数
void OTHER_THREAD_FUNCTION()
{
DELEGATENAME dINSTANCE = new DELEGATENAME( FUNCTIONNAME );
oneObject.Invoke( dINSTANCE, new object[]{ param1, param2 } );
}
こんなところでしょうか。