我使用 C# 编写带有 .NET 框架的 Windows 应用程序。如何减少这些应用程序的启动时间?我的应用程序在启动和初始化期间感觉很慢,尤其是在显示初始表单时。
我的应用程序使用 Access (MDB) 数据库来保存数据。在某些表单中,它会加载数据,但应用程序第一次显示任何给定的表单时,需要很长时间才能显示。
我尝试使用 NGen 来减少启动时间,但它并没有像预期的那样帮助我。
我使用 C# 编写带有 .NET 框架的 Windows 应用程序。如何减少这些应用程序的启动时间?我的应用程序在启动和初始化期间感觉很慢,尤其是在显示初始表单时。
我的应用程序使用 Access (MDB) 数据库来保存数据。在某些表单中,它会加载数据,但应用程序第一次显示任何给定的表单时,需要很长时间才能显示。
我尝试使用 NGen 来减少启动时间,但它并没有像预期的那样帮助我。
确保您的应用程序在启动时做的工作尽可能少。
您可以更改启动代码以将启动任务推迟到辅助线程。
我会给出更详细的答案,但是您的问题非常广泛且不够详细。
首先你需要诊断在这个启动期间运行了哪些函数,并分析每个函数消耗了多少启动延迟......
然后,一旦您知道,如果其中一两个占用了大部分时间,并且不涉及最初显示的 UI 屏幕,请在单独的线程上执行这些功能。
查看延迟加载。这涉及在第一次请求数据时加载数据并填充类,而不是在实例化类时。
// member variable
private DataSet _employeeDataSet = null;
// property
public DataSet EmployeeDataSet
{
get
{
if (_employeeDataSet == null)
_employeeDataSet = GetEmployeeDataSet();
return _employeeDataSet;
}
}
您可能希望使用EQATEC Profiler来分析您的应用程序并查看哪些函数调用需要很长时间。它使可视化后台发生的事情以及可以改进的地方变得更容易一些。
我在一个用 C# 构建 .NET 应用程序的团队中,我们一直都遇到这种情况。有一个分析器,但没有人愿意使用它,因为 1)它有点麻烦,2)输出令人困惑。我所做的是在 IDE 下启动它,虽然它运行缓慢,但我只是暂停它并通过检查调用堆栈询问它在做什么以及为什么。
由于它的速度比预期的要慢,这是因为它正在做一些将被删除或以不同方式完成的事情。这些事情通常包括函数调用,请求诸如:国际化不需要国际化的字符串,多次加载,初始化数据结构,这些数据结构只是为了完整性,稍后将被替换,解压缩和压缩更多的东西必要的。所有这些都采用中间堆栈函数/方法调用的形式,当它们出现在多个堆栈样本上时,它们都需要被关注。
尝试预见这些问题而不是把它们放进去是很好的,但你可以指望这些问题悄悄出现,尽管有最好的意图。堆栈采样(stackshots)的方法可以有效地找到它们。
这篇 MSDN 文章有很多有用的技巧,尤其是对于 .NET 2.0 应用程序。
我在那里学到的最有用的东西是调用父窗体是不够SuspendLayout() / ResumeLayout()
的,您可能需要调用BeginUpdate() / EndUpdate()
包含许多子对象的子控件(例如树,或者在我的情况下是 Infragistics ToolbarManagers)。在我的 ToolbarManager 上使用Begin / EndUpdate
可缩短启动时间 3 秒!