【问题标题】: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事件在表单显示时发生。

    【讨论】:

      【解决方案2】:

      这类似于这个 SO Question 有一个接受的答案: Single Form Hide on Startup

      这个与提升 windows 窗体性能相关的 MSDN 链接也可能对您有很大帮助: http://msdn.microsoft.com/en-us/magazine/cc163630.aspx

      【讨论】:

        【解决方案3】:

        您的假设并不完全正确:Form_Load(或者更准确地说:Load 事件处理程序)在第一次显示表单时执行。确实,此时您的表单已经可见,虽然不可用,因为您的线程被您的 FormLoad 函数阻塞。

        你有几个选择:

        1. 使用闪屏,没有控件也没有顶栏,因为它没有输入,所以你的线程被阻塞是不可见的。
        2. 在显示表格之前准备好尺寸和位置。在您调用 Show 之前设置尺寸和位置是完全合法的。例如在表单的构造函数中。
        3. 更改逻辑,使长时间计算不在 UI 线程中。使用 ThreadPool 和 Form.Invoke,调用表单上的方法,线程很简单。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          • 2023-04-02
          相关资源
          最近更新 更多