【问题标题】:C# Using PropertyGrid control to change control properties "ThreadSafe"C# 使用 PropertyGrid 控件更改控件属性“ThreadSafe”
【发布时间】:2009-10-11 00:44:34
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: c# propertygrid


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多