Вы можете создать производный подкласс, который переопределяет свойства и использует 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 в другом потоке?