WPF调度员性能(100-200更新/秒)

KBo*_*oek 5 c# wpf multithreading

在WPF窗口中,我有一个绘制实时数据的折线图(WPF的Quinn-Curtis实时图表).简而言之,对于每个新值,我调用SetCurrentValue(x,y)方法,然后使用UpdateDraw()方法更新图表.

数据通过另一个线程中的TCP连接进入.每个新值都会导致DataReceived事件,其处理程序应将值绘制到图表中,然后更新它.从逻辑上讲,我无法直接调用UpdateDraw(),因为我的图表位于UI线程中,该线程与数据进入的线程不同.

所以我调用Dispatcher.Invoke(new Action(UpdateDraw())) - 这很好,只要我更新max.30次/秒.更频繁地更新时,Dispatcher无法跟上并且图表更新的速度比数据的速度慢.我使用模拟数据的单线程情况对此进行了测试,没有Dispatcher就没有问题.

所以,我的结论是Dispatcher对于这种情况来说太慢了.我实际上需要更新100-200次/秒!

有没有办法在Dispatcher上放置涡轮增压器,还是有其他方法可以解决这个问题?欢迎任何建议.

Pie*_*kel 10

一种选择是使用共享队列来传递数据.

在数据出现的地方,您将数据推送到队列的末尾:

lock (sharedQueue)
{
    sharedQueue.Enqueue(data);
}
Run Code Online (Sandbox Code Playgroud)

在UI线程上,您可以找到一种方法来读取此数据,例如使用计时器:

var incomingData = new List<DataObject>();

lock (sharedQueue)
{
    while (sharedQueue.Count > 0)
        incomingData.Add(sharedQueue.Dequeue());
}

// Use the data in the incomingData list to plot.
Run Code Online (Sandbox Code Playgroud)

这里的想法是你没有传达数据的进来.因为你有一个恒定的数据流,我怀疑这不是问题.我不是说上面给出的确切实现是其余的,但这是关于一般的想法.

我不确定你应该如何检查新数据,因为我对应用程序的细节没有足够的了解; 但这可能是你的开始.


小智 5

你需要的是疯子 - 你真的不需要每秒100-200次更新,特别是因为屏幕通常每秒60次更新.无论如何,人们不会看到它们.

  • 将新数据输入队列.
  • 在/为调度程序触发拉取事件​​.
  • 在队列中使用Santize数据(通过双打,最后有效获胜)并将它们放入.l

每秒30次更新就足够了 - 人们不会看到差异.我在T&S的高负荷情况下对一些财务数据进行了性能问题,直到我做到了 - 现在图表看起来更好了.

保持Dispatcher移动尽可能少.


Pyg*_*gmy 5

我仍然想知道为什么您想要每秒更新图表 200 次,而您的显示器甚至无法如此快地显示图表。(请记住,普通平板显示器的更新率为 60 fps)

当您每秒只能看到更新 60 次时,每秒更新 200 次有什么用?您还可以批量处理传入数据并以 60 fps 更新图表,因为无论如何您都看不到差异。

如果它不仅仅是显示数据,而是您正在用它做其他事情 - 假设您正在监视它以查看它是否达到某个阈值 - 那么我建议将系统分成两部分:一部分全速监视,一部分监视其他以您的显示器可以处理的最大速度独立显示:60 fps。

因此,请告诉我们为什么您想要更新 ui 控件的频率高于向用户显示的频率。