WPF 中调度程序计时器的性能

本文关键字:性能 计时器 调度程序 WPF | 更新日期: 2023-09-27 18:35:28

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

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

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

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

有没有更好的方法

WPF 中调度程序计时器的性能

您可以尝试使用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)
      {
      }
}

与其使用需要更新的计时器集合,不如处理需要轮询的对象集合,以及在每个时钟周期中循环访问此列表的单个计时器。
使用线程安全集合(.Net 中提供了一些集合)。