Как получить доступ к управлению С# WPF потокобезопасным способом?

Я пытался использовать для этого примеры из MSDN, но они, похоже, применимы только к Windows Forms. Например, метод использования .InvokeRequired зависит от элемента управления Windows Forms, однако этот метод недоступен для элементов управления WPF. Метод Backgound worker также выдает InvalidOperationException

Вызывающий поток не может получить доступ к этому объекту, поскольку им владеет другой поток.

Итак, как это можно сделать в контексте WPF?


person Sebastian Gray    schedule 16.08.2009    source источник


Ответы (1)


Вы просто хотите использовать Dispatcher.Invoke метод (или его асинхронный эквивалент Dispatcher.BeginInvoke), который будет маршалировать вызов в основной поток пользовательского интерфейса WPF.

Класс DependencyObject содержит Dispatcher, что означает, что все элементы управления и другие объекты, которые наследуются от этого класса, также предоставляют это свойство, аналогично WinForms. Кроме того, объект Application обеспечивает доступ к диспетчеру.

Пример использования может быть следующим (в коде Window/UserControl):

this.Dispatcher.Invoke((Action)(() =>
    {
        ...
    }));
person Noldorin    schedule 16.08.2009
comment
Спасибо, это сработало отлично. На самом деле в WPF это выглядит намного проще, чем в формах win, когда вы знаете, что вам нужно делать ;-) - person Sebastian Gray; 17.08.2009
comment
Без проблем. И да, WPF, безусловно, имеет лучшую модель потока/передачи сообщений. - person Noldorin; 17.08.2009