【发布时间】:2019-10-21 03:16:54
【问题描述】:
所以,我有一个可调整大小的窗口,它根据它计算的实时值绘制一个图表。如果我使窗口更大,它会重绘和缩放所有内容,当图形达到新的 maxY 和 maxX 时,也会使用这些作为参考点来确定其他点的位置。这工作正常,但如果我调整窗口大小,并且安排了很多更新,窗口调整大小很好,但图表模仿了它应该在几秒钟前(最多 4 秒)做的事情。
如果我理解正确的话,每次我调用被阻塞的 UI 线程并给他新的坐标来绘制时,它都会完成当前的坐标,然后继续下一个坐标。我明白你为什么想要这样,但由于图表或多或少地不断缩放,无论如何它都会在每次更新时自行删除,所以我会节省相当多的处理能力和运行时间,如果我能完成所有当前任务并跳过所有累积的任务一直到最新的,因为存储的反正已经过时了
有没有办法做到这一点?
我想到了 3 件可能有效的事情,其中只有第 3 件,我知道会有效,或者说是可能的,即使速度很慢:
// (1) If there is a way to check if the UI thread is busy, I could just not send
// a new request to draw another line
if(!uithread.busy)
{
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => this.DrawGraph(new List<List<Coordinates>> { CoordinateListA, CoordinateListB })));
}
// (2) As soon as UI thread finishes the current task, it jumps to the newest one
// (3) In my opinion the ugliest solution, I check how long the last drawing took and
// don't send any draw-requests in that time. I will just wait that certain time and
// just then send him the newest results to draw and measure how long that took
如果没有更好的解决方案,我想我会选择(3),但由于我希望有另一种方法,所以我想问问这里的其他人是否有类似的问题。
【问题讨论】:
-
通过传递 CancellationToken 使 DrawGraph 可中止。
-
我是否会在收到新请求时取消每个排队的抽奖请求?
-
好吧,首先,无论如何,我会在调整大小时暂停绘制图表。你画的频率是多少?
-
我同意@Fildor 的建议。在这种情况下,人们通常会做的是显示一个缓存的图像,它会随着用户调整可视区域的大小而调整大小以适应。位图调整大小可以比重新生成缓存图像更有效,并且通常可以轻松跟上用户输入。然后,一旦用户完成调整大小,返回并开始创建新的缓存图像。如果用户在停止之前的调整大小操作后立即再次开始调整大小,您可能会也可能不会觉得取消该操作很有价值。
-
@Fildor 大约每秒 200 次 initiallu,每次重绘都会减少
标签: c# wpf multithreading user-interface drawing