gpt4 book ai didi

c# - 绑定(bind) View 模型属性在后台线程中更新; UI 会始终看到更新后的值吗?

转载 作者:太空狗 更新时间:2023-10-29 21:52:02 25 4
gpt4 key购买 nike

如果我有一些(非 volatile )数据通过 View 模型绑定(bind)到 UI,我从后台线程更新这些数据而不锁定任何东西,并触发 PropertyChanged 事件,我是不是保证 UI 会看到此更新?如果我是,那为什么?

我可以看到 CLRBindingWorker 调用 Dispatcher.BeginInvoke 从而确保从 UI 线程读取属性。我想知道的是属性值在 UI 线程中是否总是“新鲜的”(例如是否会发生类似于 http://www.yoda.arachsys.com/csharp/threads/volatility.shtml 的场景)。

A previous answer暗示确实如此,但没有任何解释。

例子:

public class MyViewModel : INotifyPropertyChanged
{
// Bound to the view as <TextBlock Text="{Binding Data}" />
private long _data;
public long Data
{
get { return _data; }
set
{
_data = value;
FirePropertyChanged("Data");
}
}

public MyViewModel()
{
new Thread(Updater).Start();
}

private void Updater()
{
while (true)
{
Data++;
Thread.Sleep(1000);
}
}

private void FirePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

public event PropertyChangedEventHandler PropertyChanged;
}

最佳答案

这不是一个理想的解释,但对应于 this文章中的 lock 语句会产生完整的栅栏内存屏障。 Dispatcher.BeginInvoke 的当前实现使用 lock 来更新 Dispatcher 的队列。这意味着在 UI 线程中字段分配之后和字段使用之前有完整的栅栏。

关于c# - 绑定(bind) View 模型属性在后台线程中更新; UI 会始终看到更新后的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5177958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com