奇怪的行为绑定与属性更改和繁忙的纯属性UIThread

问题描述:

我有这样的属性。奇怪的行为绑定与属性更改和繁忙的纯属性UIThread

public double RollDegrees 
    { 
     get 
     { 
      return rollDegrees; 
     } 
     set 
     { 
      if (rollDegrees != value) 
      { 
       rollDegrees = value; 
       OnPropertyChanged(PROPERTY_NAME_ROLL_DEGREES); 
      } 
     } 

它绑定到一个xaml控件,并且UI在正常情况下更新完美。 此属性在非UI线程上更新,但据我所知,使用普通属性对Dispatcher.BeginInvoke进行更新并不是必须的。

但是,当应用程序正在UI线程上运行繁忙的更新(地图控件随更新而快速移动)此属性的UI绑定未更新,则当繁忙更新完成属性时,将再次更新UI。

但如果我把

Application.Current.Dispatcher.BeginInvoke((Action)(() => 
       { 
        RollDegrees = (OperationEntity as Level).RollDegrees; 

       })); 

然后UI完美的作品

为什么这种情况正在发生任何提示?也许在忙碌的更新中有什么?或者当UI调度程序已满且繁忙时,这是正常行为?

所有UI元素只应在UI线程中更新。每个线程都有自己的调度程序。如果您需要从非UI线程更新UI,请致电Application.Current.Dispatcher.BeginInvoke()。因此这是正常的行为。

在第一种情况下,您正在更新属性,但不是从UI线程。因此,直到UI线程开始运行时才引起延迟。当您使用Application.Current.Dispatcher.BeginInvoke()时,UI会立即更新。

所以,如果你想反映一些来自不同线程的UI相关变化,请使用Application.Current.Dispatcher.BeginInvoke()

阅读更多@https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.begininvoke(v=vs.110).aspx

+0

但我读了WPF marshalls属性更改为UI线程。但是当UI线程忙时,这不起作用? – isra60

+0

这就是为什么它在UI线程变为空闲时工作。 – ViVi

+0

所以.. WPF自动编组提出低优先?? ?? – isra60