任务并行库中的INotifyPropertyChanged没有抛出异常?

5
我有一个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}"/>

。该文本框将绑定到名为TextProperty的属性。

2个回答

6

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

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

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


1
+1。有趣的 WPF 4.5 链接。看起来他们已经解决了我目前不喜欢的一些 WPF 问题。 - RichardOD
@Reed,你手头有关于WPF如何为你调度更新的参考资料吗? - Charlie Brown

1

绑定单个属性不是线程相关的。您可以无需问题地执行此操作,绑定将为您执行必要的操作。
但是要注意,这仅适用于单个属性绑定。如果您例如有一个ObservableCollection,则不能从另一个线程添加或删除项目,即使该集合通过绑定进行了绑定!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接