为什么调用refresh()是一种滥用?

本文关键字:一种 调用 refresh 为什么 | 更新日期: 2023-09-27 17:54:35

就像下面的例子:

someImage.Source = newSource;
someImage.refresh();

几天前,我在这篇文章中回应了refresh(),我得到的反馈是这是一个黑客/滥用。我不明白为什么。

为什么调用refresh()是一种滥用?

MSDN有答案

Control.Refresh:

强制控件使其客户端区域无效,并立即重新绘制自己和任何子控件。

Control.Invalidate:

使控件的整个表面无效,并导致重新绘制控件。[…]调用Invalidate方法不强制同步绘制

(我强调)

关键是RefreshInvalidate不同,强制进行同步调用,这有效地中断了表单中的默认事件流并切断了消息队列中的行。这可能会导致其他窗口消息(来自操作系统的事件)被延迟。

如果您有一个响应式用户界面,则根本不需要Refresh方法调用。设置Source属性会创建一条消息,该消息使控件的显示无效,因此在处理该消息时将自动刷新该消息。

只有当你的代码包含一个长时间运行的循环,所以它在很长一段时间内根本不处理消息时,你才需要使用Refresh方法。应该避免这样长的循环,因为它会导致用户界面无响应。

通过简单的文字Refresh()将重新加载UI,当一些变化

因为如果你正确使用的话,大多数gui框架都会自动处理刷新/更新。

使用refresh,您可以解决症状(某些内容未自动更新),而不是解决根本原因。

问题是刷新通常开始像病毒一样传播。你把它插入到一个地方,突然你需要它在第二个地方,第三个等等。

相关文章: