【发布时间】:2011-11-11 14:19:15
【问题描述】:
如果从工作线程(非 UI)更新属性值,它是否会反映在使用数据绑定和侦听属性更改的控件中?
感谢您的关注。
【问题讨论】:
-
值得注意的是,ObservableCollection 集合修改通知不是线程安全的(集合更新需要手动委派回 UI 线程。)
标签: .net wpf multithreading data-binding
如果从工作线程(非 UI)更新属性值,它是否会反映在使用数据绑定和侦听属性更改的控件中?
感谢您的关注。
【问题讨论】:
标签: .net wpf multithreading data-binding
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");
断言可能会失败,因为更新可能会在下一个任务中通过调度程序进行。它不会被更新,直到当前调用结束并将控制权返回给调度程序。
【讨论】:
是的,它会的。事实上,使用 WPF 数据绑定的主要优势之一是可以更轻松地实现这个确切的场景。
【讨论】: