我有一个 PropertyGrid,它正在另一个窗体上设置控件的控件属性。但是对于诸如“位置”和“文本”之类的东西,我遇到了跨线程问题。
有没有一种简单的方法可以安全地(不使用 AllowIlligalCrossThread=true)让这些属性的设置与属性网格一起发生?
谢谢。
我有一个 PropertyGrid,它正在另一个窗体上设置控件的控件属性。但是对于诸如“位置”和“文本”之类的东西,我遇到了跨线程问题。
有没有一种简单的方法可以安全地(不使用 AllowIlligalCrossThread=true)让这些属性的设置与属性网格一起发生?
谢谢。
您可以创建一个派生子类,它覆盖属性并使用 Invoke 以“线程安全”方式设置属性。
class DerivedLabel : Label
{
public override string Text
{
get
{
return Invoke(new Func<string>(GetText)) as string;
}
set
{
Invoke(new Action<string>(SetText), value);
}
}
private void SetText(string text)
{
base.Text = text;
}
private string GetText()
{
return base.Text;
}
}
Invoke() 在创建控件的同一线程上运行您传递的委托,因此它是隐式线程安全的。但是,如果您有很多需要子类化的控件,这可能需要做很多工作。
花时间弄清楚为什么会出现线程问题可能会更好 - 如果两个控件都是在同一个线程上创建的(对于 Windows 应用程序来说是正常的),那么您不应该遇到这些异常。您是否出于某种原因在不同的线程上创建 PropertyGrid 表单?