C# 如何提高winform的加载时间?

C# 如何提高winform的加载时间?,c#,winforms,C#,Winforms,我有一个WinForms应用程序。主窗体有很多控件,这是它加载速度非常慢的原因之一。我想做的是使表单加载更快 我已经设置了beginupdate和endupdate。窗体未在后台工作线程中呈现,因为这是主窗体。没有初始形式。当用户单击应用程序图标时,这是加载的第一个表单。添加进度条或任何启动表单对我来说都不是一个好主意 我在这里检查了有关堆栈溢出的其他问题,但它们似乎没有遇到与我相同的问题 如果你有一些例子/想法,如果你能与我分享,那将是很好的 尽量减少主窗体加载期间执行的代码或放置在主窗体上的

我有一个WinForms应用程序。主窗体有很多控件,这是它加载速度非常慢的原因之一。我想做的是使表单加载更快

我已经设置了beginupdate和endupdate。窗体未在后台工作线程中呈现,因为这是主窗体。没有初始形式。当用户单击应用程序图标时,这是加载的第一个表单。添加进度条或任何启动表单对我来说都不是一个好主意

我在这里检查了有关堆栈溢出的其他问题,但它们似乎没有遇到与我相同的问题


如果你有一些例子/想法,如果你能与我分享,那将是很好的

尽量减少主窗体加载期间执行的代码或放置在主窗体上的任何控件


您还可以探索哪一种是Microsoft的工具,它有助于提高托管应用程序的性能

当窗体加载时,它会初始化其所有控件。
表单本身不会占用您很长时间。。这是你的控制


检查您的控件,并检查它们的构造函数和初始化器中可以改进的地方。

是否立即需要所有控件?如果没有,也许您可以在一些事件触发后以编程方式加载它们,让您知道您需要该控件。

一些建议:

  • 尽量减少用户界面的复杂性。你的用户会感谢你,你将有更少的控制加载。例如,如果您有3个或4个不经常使用的控件,是否可以将它们移动到对话框中或折叠窗体的“高级”部分,以便延迟创建/显示它们?是否需要所有的控制?真正地考虑一下您试图实现的工作流-当前的控件集是实现工作流的最简单方式吗?是否需要同时显示所有控件?也许您可以将它们放置在选项卡控件中的单独选项卡上(因此实际上只有在选项卡显示时才创建控件)

  • 您能否减少使用的控件类型的范围?每种新类型的控件都可能导致程序加载新的dll以支持它。每个必须初始化的dll都会导致额外的启动时间

  • 您是否使用启动缓慢的控件?一个简单的文本字段会很快,但一个复杂的图形控件可能会很慢

  • 加载了多少个程序集(您自己的)?将所有代码组合成一个程序集(例如使用ILMerge),加载时间可能会大大缩短

  • 删除任何不需要的初始化代码。你能简化初始化吗?是否可以推迟初始化(例如,当用户单击实际需要显示数据的第一个按钮时,仅创建一些成员变量,如果实际上还不需要,则不要尝试创建与数据库的连接,等等)

  • 你能推迟(部分)UI的创建吗?例如,您可以将一组控件放入单独的UserControl表单中,然后在启动后不久(例如,在计时器上)以编程方式将此表单添加到MainForm中。这将允许您的主窗体快速显示,然后不久将使用其他控件“填充”,这可能不会提高实际启动时间,但启动时会“感觉”更快、响应更快。(如果您的MainForm滚动,并且这些额外控件最初不在屏幕上,这种方法也非常有效,因为只有当用户向下滚动到足以看到它们时,才需要创建它们)

  • 您是否显示了加载速度较慢的信息(例如,大位图图像或从SQL server获取的数据)?您可以推迟加载它们,还是将其作为后台线程运行?使用压缩来加速加载?降低其分辨率以最小化必须加载的数据量?是否对数据进行预处理并将其存储在快速启动缓存中,以便下次运行程序

  • 某些控制是否可以用优化方法替代?e、 g.您可以创建一个“按钮栏”,作为一组10个单独的控件,或作为一个单独的控件,以10个按钮的外观绘制自己。与10个单独的控件相比,单个控件的初始化和重画要容易得多

当然,一旦收集到最明显的低垂果实(甚至之前):

  • 在探查器下运行程序,查看它在哪里花费时间

我很难相信加载常规控件需要很长时间。不是其他东西在缓慢加载吗?显示一些代码加载不是很慢,绘制需要很多控件。使用更少的控件。我运行了探查器,几乎52%的延迟是由于表单初始化造成的。我有一个类似IDE的环境,用户在任何给定时间都可能需要大量其他控件。。这就是问题所在不过我很喜欢你的想法。。我们将努力实施其中的大部分。。然而,我已经决定使用后台工作线程来帮助加载我使用NGEN的一些控件。虽然加载UI的时间段已经减少,但我希望用户启动应用程序时,UI会立即显示。我检查了是否使用ngen。。没有NGEN的启动时间为7225毫秒。。运行此ngen命令ngen install后,启动时间减少了一半以上。现在是3015。。毫秒,这是控制。。我正在使用一个对接库,一些氪控制。它们功能丰富,但也带有内存标签。我见过一些其他应用程序使用相同的控件集,但它们的加载速度非常快。我想知道我是否也可以这样做。。。