Свойство модели привязанного вида обновлено в фоновом потоке; всегда ли пользовательский интерфейс будет видеть обновленное значение?

Если у меня есть некоторые (энергонезависимые) данные, привязанные к пользовательскому интерфейсу через модель представления, и я обновляю эти данные из фонового потока, ничего не блокируя, и вызываю 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;
}

6
задан Community 23 May 2017 в 12:26
поделиться