【问题标题】:Responsive startup with a Winforms app使用 Winforms 应用程序的响应式启动
【发布时间】:2011-12-29 17:00:05
【问题描述】:
我有一个视觉复杂的应用程序,其中包含许多用户界面组件和第 3 方控件。在启动时,它会进入一个短暂的连接状态,因为所有内容都在 Form_Load 中调整大小和加载(但主要是由于调整大小)。
所以我认为解决方案可能是在 Form_Load 事件的开头隐藏表单,然后在结尾显示。然而事实证明,当代码进入 Form_Load 事件时,表单已经可见。
我如何确保表单在准备好并调整大小后显示出来。
【问题讨论】:
标签:
.net
winforms
performance
.net-4.0
startup
【解决方案1】:
Load 事件在 UI 线程上执行。切勿将逻辑处理放在 UI 线程中,因为阻塞它会使 UI 无响应。
您应该派生一个新线程(请参阅Thread 类)并在那里执行您的启动逻辑。如果加载时间超过 3 秒,则可能会出现加载屏幕。您需要使用 Form.Invoke() 和委托来执行与 UI 线程交互的任何逻辑(例如,更改 TextBox 的文本)。
您还错误地假设在显示表单时会发生Load 事件。 Load事件发生在组件初始化之后,表单显示之前,然后Shown事件在表单显示时发生。
【解决方案3】:
您的假设并不完全正确:Form_Load(或者更准确地说:Load 事件处理程序)在第一次显示表单时执行。确实,此时您的表单已经可见,虽然不可用,因为您的线程被您的 FormLoad 函数阻塞。
你有几个选择:
- 使用闪屏,没有控件也没有顶栏,因为它没有输入,所以你的线程被阻塞是不可见的。
- 在显示表格之前准备好尺寸和位置。在您调用 Show 之前设置尺寸和位置是完全合法的。例如在表单的构造函数中。
- 更改逻辑,使长时间计算不在 UI 线程中。使用 ThreadPool 和 Form.Invoke,调用表单上的方法,线程很简单。