Formが動作しているスレッド外からフォームの操作を行う方法
以下のサイトのまんまです。
@IT 「.NET TIPS: Windowsフォームで別スレッドからコントロールを操作するには?」 http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html @IT 「.NET TIPS: ControlクラスのInvokeメソッドで匿名メソッドを使うには?[2.0のみ、C#]」 http://www.atmarkit.co.jp/fdotnet/dotnettips/660anonymethod/anonymethod.html
例:
別スレッドからもテキストボックスのテキストを設定できるようにするメソッドを作る
C# 3.0 で書いたら・・・
class Form1 : Form { TextBox messageTextBox; public void SetMessage(string message) { if (this.InvokeRequired) { this.Invoke( (MethodInvoker) (()=>messageTextBox.Text=message) ); } else { messageTextBox.Text = message; } } }
という風になるのかな。
無理にラムダ式書かずに、delegate使えばいいんですが。
C# 2.0 の記事の書き方が一番読む側にもわかりやすいと思います。
どうでもいい話
で、気になったけど、上側のC# 1.0 時代にかかれたっぽい記事の方で、InvokeRequired を使ったサンプルについて思うこと。
別スレッドからSetFocusメソッドを呼び出した場合には、結果的にSetFocusメソッドが2度実行されることになる
っておい、書き換えてないじゃん、意味変わってんじゃん。
なんで、 if - else 使って処理を分けないんだろう?
と、昔の記事をいまさらたたいてみる。