C#でWindows Formアプリ作成のメモ。
メインスレッド以外からFormのコントロールを変更しようとすると、InvalidOperationException が発生してしまいます。
例外を押さえ込んでも解決にはならないので、この場合は System.Windows.Forms.Control の BeginInvoke()
を使えば良いみたいです。
この BeginInvoke()
には Delegate を渡すのですが、どうせ1回しか使わないので匿名メソッドで済ませたいところ。
普通にやると「匿名メソッドからDelegateにキャストできません」と言われるので、MethodInvoker 型にキャストしてやると良いようです。
//別スレッド
void OtherThreadFunction()
{
//textBox1.Text = "ほげ"; これは例外が出る
textBox1.BeginInvoke(
(MethodInvoker)delegate(){textBox1.Text="ほげ";}
);
}
C#な人には常識なのかもしれませんが、便利だなあと感心しました。
今やっているプロジェクトは移植性を考慮に入れる必要があるため、本当は高度な言語仕様に依存したコードは増やしたくなかったんですが、便利なので使うことにします。