我有一个WPF应用程序,它监视某些进程并将其CPU和内存利用率绘制成折线图。使用性能计数器类C#读取CPU%和内存值。该图表再次是包含UserControl
的{{1}},我根据提取的值手动绘制线条。
目前我在每个图表Canvas
中使用Dispatcher计时器,并且在每个刻度线中我获取新值并绘制它。
问题是当我添加越来越多的进程来监视时,我的应用程序因为发生了大量更新而占用了CPU。
有什么更好的方式来实现我的目标?每个进程的详细信息都在一个单独的选项卡中,只有在加载时才会初始化,但是当选项卡不在视图中时停止绘图对我来说不是一个选项,因为我想要一个连续的情节。
有更好的方法吗?
答案 0 :(得分:1)
您可以尝试使用Reactive Extensions
计时器。
private IDisposable timerSubscription;
public void StartTimer()
{
timerSubscription = Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1), Scheduler.TaskPool)
.ObserveOnDispatcher()
.Subscribe(o =>
{
Console.WriteLine("Hooray I'm ticking on TaskPool for {0} times!", o);
}
}
/// and you can stop timer like this
public void StopTimer()
{
using (timerSubscription)
{
}
}
答案 1 :(得分:1)
不是要有一个需要更新的计时器集合,而是处理需要轮询的对象集合,以及在每个tick上迭代这个列表的单个计时器。
使用线程安全的集合(一些在.Net中提供)。