【问题标题】:Is WPF data binding thread safe?WPF 数据绑定线程安全吗?
【发布时间】:2011-11-11 14:19:15
【问题描述】:

如果从工作线程(非 UI)更新属性值,它是否会反映在使用数据绑定和侦听属性更改的控件中?

感谢您的关注。

【问题讨论】:

  • 值得注意的是,ObservableCollection 集合修改通知不是线程安全的(集合更新需要手动委派回 UI 线程。)

标签: .net wpf multithreading data-binding


【解决方案1】:

WPF 正在使用 Dispatcher,因此一切都在一个 UI 线程上运行,但具有开关类型并发性。当你更新一些依赖对象的 prop 时,它实际上会将一个新作业发布到调度程序队列中。当该作业运行时,它会在 UI 线程上运行并正确更新控件。 但是如果你尝试直接从后台线程访问控件,你会得到一个异常。

由于这种实现,存在某些极端情况。例如。即使您在 UI 线程上更新道具,您也不能期望控件会同步更新它以反映您的更改。所以,如果你有这样的 xaml:

<TextBox x:name="tb" Text="{Binding Text"}/>

还有这样的代码:

var model = new { Text = "aaa" };
tb.DataContext = model;
model.Text = "bbb";
Debug.Assert(tb.Text == "bbb");

断言可能会失败,因为更新可能会在下一个任务中通过调度程序进行。它不会被更新,直到当前调用结束并将控制权返回给调度程序。

【讨论】:

    【解决方案2】:

    是的,它会的。事实上,使用 WPF 数据绑定的主要优势之一是可以更轻松地实现这个确切的场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多