1 回答
TA贡献1846条经验 获得超7个赞
一个可能的原因是Dispatcher.Invoke限制(放慢了)update的算法MyDate,并允许UI线程跟上这些更新。假设您有以下代码:
new Thread(() => {
while (true) {
this.MyDate = DateTime.UtcNow;
}
})
{
IsBackground = true
}.Start();
在极端情况下,值会不断更新而没有任何延迟。发生的是调用OnPropertyChangedon时MyDate,WPF将通过Dispatcher.BeginInvoke(注释Begin)在UI线程上对绑定更新进行排队。
在那种极端情况下,它将很快淹没UI线程队列,并且UI线程将无法跟上要处理的未决操作的数量。那是因为它是异步的,因此Dispatcher.BeginInvoke不会减慢该while (true)线程的速度。
现在,假设您包裹this.MyDate = DateTime.UtcNow在里面Dispatcher.Invoke。Invoke是同步的,直到UI线程实际执行此操作后才返回。现在,循环受到了限制,并且运行速度要慢得多,因为更新UI现在已成为循环的一部分,并且UI操作队列不会无限增长。
在现实生活中,值得限制UI更新自己。因此,如果您有一个紧密的循环-不要在每次迭代中更新UI绑定的属性,而是在每个X(100,1000)迭代中更新,这样就不会给UI线程造成太大负担(反正太快了,更新就没用了,因为人眼无论如何都无法捕获您的1ms更新)。如果您认为“修复”没问题(因为它无需太多理由就减慢了算法的执行速度)(执行UI更新),那么“修复”可能就可以了。
- 1 回答
- 0 关注
- 330 浏览
添加回答
举报