我花了很多时间使用 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();
}