【问题标题】:Task parallel library INotifyPropertyChanged NOT throwing an exception?任务并行库 INotifyPropertyChanged 不抛出异常?
【发布时间】:2011-11-03 17:33:42
【问题描述】:

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

【问题讨论】:

    标签: wpf inotifypropertychanged task-parallel-library


    【解决方案1】:

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

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

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

    【讨论】:

    • +1。 WPF 4.5 的有趣链接。看起来他们已经整理了一些我目前不喜欢 WPF 的地方。
    • @Reed 你有没有关于 wpf 如何为你编组更新的参考资料?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多