【发布时间】:2018-04-23 09:15:01
【问题描述】:
我已经解决了一些 UI 更新缓慢的问题,我想听听为什么我的代码修改实际上提高了性能。
我开发了一个 WPF 应用程序,MVVM 架构。 我在视图模型中有一个属性:
public DateTime MyDate
{
get
{
return _myDate;
}
set
{
_myDate= value;
OnPropertyChanged()
OnPropertyChanged(() => MyDateFormatted);
}
}
MyDateFormatted 如下所示:
public string MyDateFormatted
{
get { return _myDate.ToString("MMMM dd, yyyy"); }
}
MyDate 的设置器不会发生在 UI 线程上。 MyDateFormatted 的 getter 发生在 UI 线程上,因为正如我所读到的,WPF 会自动将属性更改编组到 UI 线程。
Making sure OnPropertyChanged() is called on UI thread in MVVM WPF app
确实,用户界面已更新,但非常缓慢。 曾经,我手动附加了 OnPropertyChanged(() => MyDateFormatted); 到 UI 调度程序,通过调用包围它: Application.Current.Dispatcher, UI 现在可以按照我想要的速度更新,并且性能得到了显着提升。你能解释一下为什么吗?谢谢!
【问题讨论】:
-
您多久更新一次该属性以导致性能问题?
-
@Evk 非常非常非常频繁。像每毫秒一样
-
对于您发布的两种实现,很明显您不需要调用方法
OnPropertyChanged两次。这两个调用的作用相同——第一个调用使用 .NET 4.5+ 功能来获取属性名称,第二个调用使用表达式(肯定更慢)功能。只调用一次,我更喜欢第一个。
标签: c# wpf multithreading