Задача параллельной библиотеки INotifyPropertyChanged НЕ выдает исключение? - PullRequest
5 голосов
/ 03 ноября 2011

У меня есть проект wpf, в котором я использую INotifyPropertyChanged для свойства, которое привязывается к текстовому полю. Я обновляю это значение в другом потоке, используя задачу (TaskParallelLibrary). Он обновляется должным образом и не выдает исключение. Я думал, что это вызовет исключение, потому что он работает в фоновом потоке, а не в потоке интерфейса пользователя. Конечно, это вызывает исключение, если я непосредственно использую элемент пользовательского интерфейса. Итак, механизм связывания INotifyPropertyChanged обеспечивает автоматическую диспетчеризацию потока пользовательского интерфейса?

Вот мой код со свойством.

private string _textProperty = "";
    public string TextProperty
    {
        get
        {
            return _textProperty;
        }
        set
        {
            if (_textProperty != value)
            {
                _textProperty = value;
                NotifyPropertyChanged("TextProperty");
            }
        }
    }

и моя задача -

var task = new Task(() =>
        {
            TextProperty = "ABCD"; // Works.
            // txtBox.Text = "ABCD"; // Throws an exception.
        });
        task.Start();

и текстовое поле в XAML <TextBox Name="txtBox" Text="{Binding TextProperty}"/>

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

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

WPF позволяет устанавливать связанное значение в фоновом потоке. Он будет обрабатывать маршалинг для потока пользовательского интерфейса для вас.

Имейте в виду, однако, что это не работает для элементов коллекции. Если вы хотите добавить к ObservableCollection<T>, который связан, например, вам придется вернуться обратно в поток пользовательского интерфейса. Однако существует различных обходных путей , которые могут облегчить это при необходимости. Обратите внимание, что это поведение изменяется в WPF 4.5 , что упростит многопоточную разработку в WPF в будущем.

1 голос
/ 03 ноября 2011

Привязка к отдельным свойствам не является аффинной. Вы можете сделать это без проблем, переплет сделает все необходимое за вас.
Однако будьте осторожны, это только для привязок одного свойства. Если у вас есть, например, ObservableCollection, вы не можете добавлять или удалять элементы из другого потока, даже если коллекция связана через связывание!

...