任务并行库INotifyPropertyChanged不抛出异常?

Jon*_*nna 5 wpf inotifypropertychanged task-parallel-library

我有一个wpf项目,我在一个绑定到文本框的属性上使用INotifyPropertyChanged.我正在使用任务(TaskParallelLibrary)在不同的线程上更新此值.它已正确更新,不会抛出异常.我认为它会抛出异常,因为它运行在后台线程而不是UI线程.当然,如果我直接使用UI元素,它会抛出异常.那么,INotifyPropertyChanged绑定机制是否会自动调度到UI线程?

这是我的属性代码.

private string _textProperty = "";
    public string TextProperty
    {
        get
        {
            return _textProperty;
        }
        set
        {
            if (_textProperty != value)
            {
                _textProperty = value;
                NotifyPropertyChanged("TextProperty");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的任务创建是

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

和XAML中的文本框是 <TextBox Name="txtBox" Text="{Binding TextProperty}"/>

Ree*_*sey 6

我认为它会抛出异常,因为它运行在后台线程而不是UI线程.

WPF允许您在后台线程上设置绑定值.它将为您处理UI线程的编组.

请注意,但是,这并没有对集合的元素工作.ObservableCollection<T>例如,如果要添加到绑定的域,则必须编组回UI线程.但是,有各种解决方法,如果需要,可以简化此操作.请注意,此行为在WPF 4.5中更改,这将在将来简化WPF中的多线程开发.