3

我有一个 WPF 应用程序,它监视某些进程并将它们的 CPU 和内存利用率绘制成折线图。使用性能计数器类 C# 读取 CPU% 和内存值。该图再次UserControl包含 a Canvas,我根据获取的值手动在其中绘制线条。

目前,我在每个图表中使用调度程序计时器,UserControl并且在每个刻度中,我都在获取新值并绘制它。

问题是当我添加越来越多的要监控的进程时,我的应用程序会占用 CPU,因为有很多更新正在发生。

实现我正在尝试的更好方法是什么?每个过程的详细信息都在单独的选项卡中,并且仅在加载时才会初始化,但是当我想要连续绘图时,在没有视图的情况下停止图不是一个选项。

有没有更好的方法来做到这一点?

4

2 回答 2

1

与其拥有需要更新的计时器集合,不如处理需要轮询的对象集合,以及将在每个滴答时遍历此列表的单个计时器。
使用线程安全的集合(.Net 中提供了一些)。

于 2013-10-16T09:30:23.920 回答
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)
      {

      }
}
于 2013-10-16T08:11:41.303 回答