3

我使用 C# 编写带有 .NET 框架的 Windows 应用程序。如何减少这些应用程序的启动时间?我的应用程序在启动和初始化期间感觉很慢,尤其是在显示初始表单时。

我的应用程序使用 Access (MDB) 数据库来保存数据。在某些表单中,它会加载数据,但应用程序第一次显示任何给定的表单时,需要很长时间才能显示。

我尝试使用 NGen 来减少启动时间,但它并没有像预期的那样帮助我。

4

6 回答 6

10

确保您的应用程序在启动时做的工作尽可能少。

您可以更改启动代码以将启动任务推迟到辅助线程。

我会给出更详细的答案,但是您的问题非常广泛且不够详细。

于 2010-01-15T16:25:38.723 回答
3

首先你需要诊断在这个启动期间运行了哪些函数,并分析每个函数消耗了多少启动延迟......

然后,一旦您知道,如果其中一两个占用了大部分时间,并且不涉及最初显示的 UI 屏幕,请在单独的线程上执行这些功能。

于 2010-01-15T16:36:10.653 回答
3

查看延迟加载。这涉及在第一次请求数据时加载数据并填充类,而不是在实例化类时。

// member variable
        private DataSet _employeeDataSet = null;

    // property
    public DataSet EmployeeDataSet
    {
        get
        {
            if (_employeeDataSet == null)
                _employeeDataSet = GetEmployeeDataSet();

            return _employeeDataSet;
        }
    }
于 2010-01-15T16:44:54.660 回答
1

您可能希望使用EQATEC Profiler来分析您的应用程序并查看哪些函数调用需要很长时间。它使可视化后台发生的事情以及可以改进的地方变得更容易一些。

于 2010-01-15T16:42:32.403 回答
1

我在一个用 C# 构建 .NET 应用程序的团队中,我们一直都遇到这种情况。有一个分析器,但没有人愿意使用它,因为 1)它有点麻烦,2)输出令人困惑。我所做的是在 IDE 下启动它,虽然它运行缓慢,但我只是暂停它并通过检查调用堆栈询问它在做什么以及为什么。

由于它的速度比预期的要慢,这是因为它正在做一些将被删除或以不同方式完成的事情。这些事情通常包括函数调用,请求诸如:国际化不需要国际化的字符串,多次加载,初始化数据结构,这些数据结构只是为了完整性,稍后将被替换,解压缩和压缩更多的东西必要的。所有这些都采用中间堆栈函数/方法调用的形式,当它们出现在多个堆栈样本上时,它们都需要被关注。

尝试预见这些问题而不是把它们放进去是很好的,但你可以指望这些问题悄悄出现,尽管有最好的意图。堆栈采样(stackshots)的方法可以有效地找到它们。

于 2010-01-15T20:35:27.753 回答
0

这篇 MSDN 文章有很多有用的技巧,尤其是对于 .NET 2.0 应用程序。

我在那里学到的最有用的东西是调用父窗体是不够SuspendLayout() / ResumeLayout()的,您可能需要调用BeginUpdate() / EndUpdate()包含许多子对象的子控件(例如树,或者在我的情况下是 Infragistics ToolbarManagers)。在我的 ToolbarManager 上使用Begin / EndUpdate可缩短启动时间 3 秒!

于 2011-11-16T08:30:54.423 回答