如果我有一些(非易失性)数据通过视图模型绑定到 UI,并且我从后台线程更新这些数据而不锁定任何内容并触发PropertyChanged
事件,我是否保证UI 会看到此更新?如果我是,那为什么?
我可以看到CLRBindingWorker
调用Dispatcher.BeginInvoke
,从而确保从 UI 线程读取属性。我想知道的是属性值在 UI 线程中是否总是“新鲜”的(例如,是否会发生类似于http://www.yoda.arachsys.com/csharp/threads/volatility.shtml的场景)。
先前的答案表明确实如此,但没有任何解释。
例子:
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;
}