C#使用PropertyGrid控件来更改控件属性“ThreadSafe”

时间:2009-10-11 00:44:34

标签: c# propertygrid

我有一个PropertyGrid,它在另一个窗体上设置控件的控件属性。但是对于诸如“位置”和“文本”之类的东西,我遇到了交叉线程问题。

是否有一种安全的简单方法(不使用AllowIlligalCrossThread = true)让属性网格设置这些属性?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以创建一个派生子类来覆盖属性,并使用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表单?