.net - WPF 数据绑定(bind)线程安全吗?

标签 .net wpf multithreading data-binding

如果从工作线程(非 UI)更新属性值,它会反射(reflect)在使用数据绑定(bind)和监听属性更改的控件中吗?

感谢您的关注。

最佳答案

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

由于这种实现,存在某些边缘情况。例如。即使您在 UI 线程上更新 Prop ,您也不能期望控件会同步更新它以反射(reflect)您的更改。所以,如果你有这样的 xaml:

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

和这样的代码:
var model = new { Text = "aaa" };
tb.DataContext = model;
model.Text = "bbb";
Debug.Assert(tb.Text == "bbb");

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

关于.net - WPF 数据绑定(bind)线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8095240/

相关文章:

.net - 是否可以使用 Azure Web 应用程序服务来托管 .NET Core Web 应用程序以及 Wordpress 平台?

c# - 如何在 C# 中生成 UUID

wpf - 可调整大小的 WPF 网格根据实际大小在行和列之间插入空行

c# - 将 2 个表绑定(bind)在一起(一对多关系)

c# - LINQ 方法的运行时复杂性 (Big-O) 有哪些保证?

c# - 旋转后更改 WPF 元素的父元素(设置新坐标问题)

wpf - 用户控制 : Can I set my own DependencyProperty in XAML?

java - 第二个线程如何检查和重新检查第一个线程当前使用的类的锁对象?

c++ - 将 std::map 对象传递给线程

android - 如何为 Listviews 安排繁重的工作以便稍后显示?