Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C使用PropertyGrid控件更改控件属性“ThreadSafe”_C#_Propertygrid - Fatal编程技术网

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

C# C使用PropertyGrid控件更改控件属性“ThreadSafe”,c#,propertygrid,C#,Propertygrid,我有一个PropertyGrid,它在另一个窗体上设置控件的属性。然而,对于位置和文本等问题,我遇到了一个跨线程问题 有没有一种简单的方法可以安全地不使用AllowIlligalCrossThread=true,让这些属性的设置与属性网格一起出现 谢谢。您可以创建一个派生子类,该子类重写属性,并使用Invoke以线程安全的方式设置属性 class DerivedLabel : Label { public override string Text { get

我有一个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表单