c# - 定时器的性能成本

标签 c# wpf performance timer

我需要优化一个相当大的 WPF 应用程序。我们正在以非常高的频率从领域层获取数据更新。优化 UI 的一种想法是延迟某些 UI 元素的更新以提高 UI 性能。假设我们在域模型中有一个属性“Counter”,它每秒更改大约 100 次。所以我们可以创建一个每秒只触发一次的计时器,并在计时器触发时更新 ViewModel 中的相应属性。到目前为止效果很好。计时器每秒将域对象的值复制到 View 模型一次,我们就完成了。

问题是:每个 View 模型实例代表列表中的一个条目。这个列表可能有几千个条目。使用我描述的解决方案,我们还将创建数千个计时器。我猜想创建这么多计时器实例不是个好主意。一个简单的解决方案是在基类或其他地方创建一个静态计时器实例,然后只使用这个实例来更新所有 View 模型。但这也是不可能的。我们有任何不同的属性应该独立于领域模型进行更新,并且每个属性都应该有一个单独的更新率。

问题 1:有谁知道定时器有多贵?创建数千个计时器真的很重要吗?

问题 2:另一种解决方案是创建某种调度程序……一种“MultiTimer”,我可以在其中注册多个超时。有没有人对如何实现类似的东西有建议?

最佳答案

这可以使用 Microsoft's Reactive Extensions 以更优雅的方式实现- 简称 Rx。在其他很酷的功能中,Rx 包含一个 Throttle Method,它非常适合驯服激进的事件源。看看here .

关于c# - 定时器的性能成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6812850/

相关文章:

c# - 如何检查一个对象是否被定义?

c# - 如何在 lucene.net 中使用函数 SynonymAnalyzer

c# - WPF 绑定(bind)到带有类的字典

c# - 如何通过代码添加事件 setter

c# - 运行程序的多个实例以加快进程?

c# - 如何在处理函数的其余部分之前更新 WPF 中的 UI 元素?

c# - 如何在 SpannableString Android 中设置不透明度/alpha

c# - Windows Phone 8.1 MediaElement 灾难性故障(HRESULT 异常 : 0x8000FFFF (E_UNEXPECTED))

java - Hashmap jdk1.7无锁get()和同步put()的线程安全

java - 如何在线性时间内使用自定义比较器构建优先队列