批量UI更新是否值得针对BeginInvoke瓶颈?

时间:2012-06-11 18:14:48

标签: c# wpf

我的情况是我有表示游戏对象的文本文件。 我要做的是解析文件并获取游戏对象将被绘制的点。 例如

fruits.txt
pear 10, 20
orange 10,38

每当我点一点时,我都会使用调度程序begininvoke将新的水果更新到屏幕上。 这比调用单个线程更好。每当我有多个屏幕并行更新它们的点时,它变得非常慢并且在绘制到屏幕时它开始挂起或帧跳跃。 这是因为BeginInvoke对消息进行排队吗?虽然冻结BeginInvoke仍然比Invoke工作得更快,尽管Invoke具有更平滑的更新。如何让BeginInvoke“刷新消息”到屏幕。 在其他一些帖子中有一个想法,我可以将点保存在队列中并在队列中仍然存在某些东西时绘制到屏幕,但没有任何区别。 请问有什么想法?  感谢。

1 个答案:

答案 0 :(得分:0)

根据MSDN Control.BeginInvoke()

  

在控件的线程上异步执行委托   底层句柄是在。上创建的。

在你的情况下,反复调用BeginInvoke会向MAIN UI线程添加大量调用,并将其与其他工作混淆。

你绝对最好在队列中对你的点进行批处理,然后立即将它们绘制到屏幕上,而不是试图在同一个线程上异步运行多个绘图。