そのため、アプリケーションをマルチスレッド化しました。「クロススレッド操作が無効です: コントロールが作成されたスレッド以外のスレッドからアクセスされました。」というエラーが発生しました。
私のスレッドは、Windows フォーム コントロールを呼び出していました。これを回避するために、私は使用しました
Control.Invoke(new MethodInvoker(delegate { ControlsAction; }));
コードを再利用してアプリをよりきれいにすることができるように、この汎用メソッドを作成する方法を見つけようとしています。
たとえば、呼び出しの際に、リッチ テキスト ボックスを使用して次のことを行います。
rtbOutput.Invoke(new MethodInvoker(delegate {
rtbOutput.AppendText(fields[0].TrimStart().TrimEnd().ToString() + " Profile not
removed. Check Logs.\n"); }));
もう 1 つは、単純にテキストを設定するコンボ ボックスです。
cmbEmailProfile.Invoke(new MethodInvoker(delegate { EmailProfileNameToSetForUsers =
cmbEmailProfile.Text; }));
もう 1 つの例は、単純にクリアするリッチ テキスト ボックスです。
rtbOutput.Invoke(new MethodInvoker(delegate { rtbOutput.Clear(); }));
実行したいアクションでコントロールを渡すだけでよい場合に、これを行うことができる汎用関数を作成するにはどうすればよいですか?
これが私たちがこれまでにやってきたことです。
private void methodInvoker(Control sender, Action act)
{
sender.Invoke(new MethodInvoker(act));
}
問題はappendtextのようなもので、気に入らないようです。