他のスレッドからFormの部品を操作したい | プログラミングがわからなすぎる

プログラミングがわからなすぎる

気が向いた時の備忘録。プログラミングは好きなのに物凄く単純なものしか理解できないからメモしていくうちに覚えられたらいいな
ターゲットフレームワークは大体4.7.2

Windows Formアプリケーション作成中に以下のエラーを出してしまうことがある

「System.InvalidOperationException:'有効ではないスレッド間の操作:コントロールが作成されたスレッド以外のスレッドからコントロール'XXXX'がアクセスされました。'」

これの対処法をメモしておきたい

 

 

エラー発生例 

Formとは別のスレッドでFormのShowMessage()メソッドを呼び出してみる

 

ShowMessage()メソッドはこれ。

この場合は問題なく動く

 

ShowMessage()メソッドを、

Formに設置したテキストボックスの内容を変更する処理に書き換えてみる

 

なんか怒られた

 

メソッドの呼び方を変える 

ShowMessage()を呼び出し方をInvokeにしてみる

 

怒られずにすんだ

 

メモ 

 

Formとは別のスレッドから、Formに配置したコントロールを操作するメソッドを動かしたいときはActionまたはFuncを使用する

 

◆form.Invoke(Action(form.XXX))

  パラメータをメソッドに渡さない

◆form.Invoke<パラメータ型>(Anction(form.XXX), パラメータ)

  パラメータをメソッドに渡す

◆object obj = FormSet.form.Invoke(new Func<戻り値型>(form.XXX));

  パラメータをメソッドに渡さず、戻り値を受け取る

◆object obj = form.Invoke(new Func<パラメータ型, 戻り値型>(form.XXX), パラメータ);

  パラメータをメソッドに渡し、戻り値を受け取る

 

form:メソッドが書いてある先のFormのインスタンス

XXX:呼び出したいメソッド名

変数:渡したいパラメータの変数の型(intとかstringとか)

   複数パラメータがある場合は<int, string, bool>のように複数記載する

パラメータ:引き渡すパラメータ

      複数渡す場合は変数と同じようにカンマで区切って並べる

パラメータ型:パラメータの型を指定する

       複数渡す場合は変数と同じようにカンマで区切って並べる

戻り値型:戻り値の型を指定する