如果从工作线程(非 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/