C # Использование элемента управления PropertyGrid для изменения свойств элемента управления "ThreadSafe" - PullRequest
0 голосов
/ 11 октября 2009

У меня есть PropertyGrid, который устанавливает свойства элемента управления в другой форме. Однако для таких вещей, как «Расположение» и «Текст», возникают проблемы с многопоточностью.

Есть ли простой способ безопасно (не используя AllowIlligalCrossThread = true) разрешить установку этих свойств в сетке свойств?

Спасибо.

1 Ответ

0 голосов
/ 11 октября 2009

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

...