WPF数据绑定是线程安全的吗?

4
如果一个属性的值是从工作线程(非UI)更新的,那么使用数据绑定并监听属性更改的控件是否会反映出来?
感谢您的关注。

1
值得注意的是,然而 ObservableCollection 集合修改通知 不是 线程安全的(集合更新需要手动委托回 UI 线程)。 - Dan Bryant
2个回答

8

WPF 使用 Dispatcher,使得所有工作都在同一个 UI 线程上进行,但是它具有切换类型的并发性。当您更新某个依赖对象的属性时,它实际上会将一个新任务添加到 Dispatcher 队列中。当该任务运行时,它将在 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");

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


0

是的,它会。事实上,使用WPF数据绑定的主要优势之一就是使实现这种情况变得更简单。


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