背景
BackgroundWorker使ってると、裏タスク側からフォームにアクセスしたくなりますよね
そんな時Control.Invokeを使え!ってのは余りにも有名
でも、delegateを毎回定義するの大変なんですよー
基本1回しか使わないのでメソッド定義するのも悩ましくてさ
対策
っても何の事はもなく、MSもきちんと考えてくれてました
delegate void MethodInvoker();
と云うのが標準で定義されているので、それと匿名関数を組み合わせれば…
this.Invoke((MethodInvoker)delegate() {
textBox1.Text = "むふっ";
});
はい、出来上がり
展開
そこでふと考えた…
パラメータ渡したかったり、結果を受け取りたいときはどうすれば良いんだ!
自分で delegate
定義しろって事かい?
よーし、何とかしてやろうじゃないか
delegate void MethodInvoker<T1>(T1 arg1);
delegate void MethodInvoker<T1, T2>(T1 arg1, T2 arg2);
delegate void MethodInvoker<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
:
序に…
delegate T0 FunctionInvoker<T0>();
delegate T0 FunctionInvoker<T0, T1>(T1 arg1);
delegate T0 FunctionInvoker<T0, T1, T2>(T1 arg1, T2 arg2);
delegate T0 FunctionInvoker<T0, T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
:
引数は arg9
位まで用意しとけば良いかな、ふふん楽勝楽勝
まったく Console.WriteLine
のオーバーロードみたいに引数9つ分位用意しといてくれればいいのに
全くMSも気が利かない
結果
いっぱい定義並べて満足しました
string name = this.Invoke((FunctionInvoker)delegate<string>() {
return textBox2.Text;
});
って確かに使えるし、満足満足………
……
でもさー
よーく考えたら画面部品じゃなければ普通にアクセスできるんですよねー
わざわざパラメータで渡さなくたって、わざわざ戻り値で返さなくたって、そこら辺の変数に触り放題じゃん
という事で、標準定義のMethodInvokerだけあれば何の問題もない事に今更気づくと云う…
思い付きで手を動かすのは良くないなぁ
でもま、楽しかったから良しとするか、と云うお話