Если у меня есть некоторые (энергонезависимые) данные, привязанные к пользовательскому интерфейсу через модель представления, и я обновляю эти данные из фонового потока, ничего не блокируя, и вызываю PropertyChanged
событие, Я гарантировал , что пользовательский интерфейс увидит это обновление? Если да, то почему?
Я вижу, что CLRBindingWorker
вызывает Dispatcher.BeginInvoke
и, таким образом, обеспечивает чтение свойства из потока пользовательского интерфейса. Я хочу знать, всегда ли значение свойства будет «свежим» в потоке пользовательского интерфейса (например, будет ли сценарий похож на http://www.yoda.arachsys.com/csharp/threads/volatility.shtml может произойти).
предыдущий ответ предположил, что это действительно так, но без каких-либо объяснений.
Пример:
public class MyViewModel : INotifyPropertyChanged
{
// Bound to the view as
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;
}