非同期デリゲートからGUIにアクセスする場合のイディオム(匿名デリゲート編)
先日の同名のエントリにartonさんからコメントを頂いたのだが、そのおかけでもう一つの書き方を思い出した。
//メソッドと同じシグネチャを持つデリゲートの定義 private delegate void ResultShowingHandler(object args); //Controlにアクセスするロジックを切り出したメソッド private void ResultShowing(object args) { //非同期処理に対応 if (this.Form1.InvokeRequired) { //匿名デリゲート ResultShowingHandler handler = delegate(object innerArgs) { this.ResultShowing(innerArgs); } this.Form1.Invoke(handler, new object[] {args}); return; } //これ以降にFormとその配下のコントロールにアクセスする処理を記述 }
ただし、この書き方にしても相変わらずデリゲート型の定義が必要であり、あまりメリットが無い。匿名デリゲートで書くならば本当は以下のような書き方ができるとラムダ関数のようでスマートだと思うのだが、
//匿名デリゲート Delegate anonymousHandler = delegate(object innerArgs) { this.ResultShowing(innerArgs); } this.Form1.Invoke(anonymousHandler, new object[]{args}); return;
書いてみるとコンパイルが通らない。匿名デリゲートはSystem.Delegateと互換性が無いのでこれは駄目なのだ。なんか、凄くがっかりする落ちだな。