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

时间:2011-11-03 17:33:43

标签: 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");
            }
        }
    }

我的任务创建是

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

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

2 个答案:

答案 0 :(得分:6)

  

我认为它会引发异常,因为它在后台线程而不是UI线程上运行。

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

但请注意, 不适用于集合的元素。例如,如果要添加到绑定的ObservableCollection<T>,则必须编组回UI线程。但是,various workarounds可以根据需要简化此操作。请注意this behavior changes in WPF 4.5,这将在未来简化WPF中的多线程开发。

答案 1 :(得分:1)

绑定到单个属性不是线程仿射。您可以毫无问题地执行此操作,绑定将为您执行必要的操作 但请注意,这仅适用于单个属性绑定。如果您有一个ObservableCollection,则无法在另一个线程中添加或删除项目,即使该集合是通过绑定绑定的!