Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何加快控件刷新速度?_C#_Controls_Drawing_Refresh - Fatal编程技术网

C# 如何加快控件刷新速度?

C# 如何加快控件刷新速度?,c#,controls,drawing,refresh,C#,Controls,Drawing,Refresh,我在C#中有一个自定义控件。我注意到调用Refresh要比我想要的慢得多(大约0.1ms),即使我有一个空的RePaint函数。基本上,我的应用程序处理一个网格,并逐个刷新每个网格单元。这种相当低效的行为是故意的;启用后,我希望能够实际看到处理的每个步骤都完成了什么,并且每个步骤只会改变一个单元格。切换双缓冲并没有多大区别 有人能提供一些建议吗 目前,我想到的最好的改进是将调用Refresh替换为调用Refresh2。后一个函数是Repaint的精确副本,除了顶部添加了两行,Graphics g

我在C#中有一个自定义控件。我注意到调用
Refresh
要比我想要的慢得多(大约0.1ms),即使我有一个空的
RePaint
函数。基本上,我的应用程序处理一个网格,并逐个刷新每个网格单元。这种相当低效的行为是故意的;启用后,我希望能够实际看到处理的每个步骤都完成了什么,并且每个步骤只会改变一个单元格。切换双缓冲并没有多大区别

有人能提供一些建议吗


目前,我想到的最好的改进是将调用
Refresh
替换为调用
Refresh2
。后一个函数是
Repaint
的精确副本,除了顶部添加了两行,
Graphics g=Graphics.FromHwnd(this.Handle);g、 清晰(背景色)并将
e.Graphics
替换为
g
。我怀疑这有一些缺点,但它确实将绘图速度减半。请注意,我正在使用的控件没有子组件,因此验证之类的事情没有那么重要。

刷新太多会降低速度,就像您所经历的那样,尝试压缩事件,即在获得新网格时不刷新,但在需要更新时设置变量,例如,让计时器每1秒检查一次该变量,然后刷新。

刷新是自动重复事件还是响应用户事件

在第一种情况下,它应该是异步的(在它自己的线程中)。如果是响应用户事件,那么在“刷新”对事件不重要的情况下也是如此

如果更新接口的代码太慢,请确保它只是在更新接口(它应该已经准备好了数据..这是双重缓冲)。如果不是这样,那么做一些日志记录,找出什么花费了太多的时间


如果它必须首先获取数据,那么可能会出现一些延迟。如果这是不可接受的,那么您需要有一些缓存机制。您可以让缓存自动异步更新,或者让它返回缓存的内容,获取新数据,然后进行另一次更新。。或者类似的东西。

我已经做了分析和日志记录,还有其他的。如果我删除该调用以刷新或替换为另一个调用,所花费的时间就会消失。清空“重新绘制”功能会阻止刷新正常工作,但不会显著减少所需时间。显然,刷新函数不仅仅是调用repaint,它所做的其他事情是占用时间。