私は Windows フォーム コントロールの操作に多くの時間を費やしていますが、バックグラウンド ワーカー スレッドから使用しています。ユーザーがボタンをクリックしたときにフォームがロックされたくないので、これは本当に良い習慣だと思います。正直なところ、バックグラウンド ワーカー スレッドで通常実行する GUI 関連のほぼすべてのアクションで、インターフェイスはユーザーへの応答性に優れています (もっと多くの人がそうしてくれたらいいのに!)。
だから私の質問は...コントロールとやり取りする必要があるたびに、次のようなもので「呼び出す」必要があります。
if (control.InvokeRequired)
{
//
}
標準的な練習ですよね?ただし、これにより、非常に厄介なコードが発生します。これは、私が持っているほぼすべてのコントロール タイプで、MethodInvoker デリゲートまたは何かが必要になるためです。何千行ものコードをプロテクトに追加しており、非常に時間がかかります。
現在、次のような何百もの「プロパティ設定」メソッドがあります。
private void Safe_SetLableText(Label control, string text)
{
if (control.InvokeRequired)
{
control.Invoke((MethodInvoker)delegate
{
control.Text = text;
});
}
else
{
control.Text = text;
}
}
それで、他のテクニック、これを行う方法、またはコントロールが何であるか、どのスレッドにいるかに関係なく、コントロールのプロパティを常に変更できる方法はありますか?
次のようなもの: (疑似コード)
BackgroundWorker.RunWorkerAsync();
private void thing_to_do()
{
// We are in a background thread now
DoSomeDatabaseWorkThatTakesALongTime();
InvokeAnyControls();
// Do some stuff...
controlX.Text = "123"
controlY.Height = 300;
controlZ.text = ControlA.text;
RestoreAnyControls();
}