代码之家  ›  专栏  ›  技术社区  ›  Herman Cordes

方法调用和方法条目(c)之间发生了什么?

  •  3
  • Herman Cordes  · 技术社区  · 16 年前

    目前,我们在启动中等大小的WPF应用程序时遇到了问题。完全加载大约需要15秒。我们想知道这需要多长时间。

    如果应用程序启动app.xaml,则会初始化控制器。此控制器位于单独的“业务”程序集中,它依次调用“数据”程序集以收集有关用户的信息等。这个组件相对较小,分别为160K和60K。

    进入此事件所需的时间是15秒。所以我们在另一个方法中分离代码,并在事件中调用它。通过此更改,我们发现调试器在启动后直接进入应用程序启动事件。但是,从到达调用分离方法的行并进入该方法的点开始,它又花了15秒。

    在这段时间内,Visual Studio的输出或调用堆栈窗口中没有发生任何事件。所以问题是:

    1. 在方法调用之后和进入方法之前,是否有任何方法可以查看发生了什么?
    2. 在这个15秒的时间段内,方法加载是否需要程序集?如果是真的,缩短时间的方法是什么?

    感谢您的回复。

    编辑,分离方法的请求代码:

            try
            {
                // Check whether debug mode is enabled or not.
                string[] commandArgs = Environment.GetCommandLineArgs();
                ApplicationLog.DebugMode =
                    (commandArgs.Length > 1 &&
                    (commandArgs[1].IndexOf("debug") > 0) ||
                    (commandArgs.Length > 2 && commandArgs[2].IndexOf("debug") > 0));
    
                // Logging startup.
                ApplicationLog.Log("Starting at " + Environment.MachineName, 21003);
    
                // Check to start configtool or main application.
                if (commandArgs.Length > 1 &&
                    (commandArgs[1].IndexOf("config") > 0 || commandArgs[2].IndexOf("config") > 0))
                {
                    ConnectionStringWindow window = new ConnectionStringWindow();
                    window.DataContext = new ViewModels.ConnectionStringViewModel();
                    window.Show();
                }
                else
                {
                    // The main window.
                    MainWindow mainWindow = new MainWindow();
                    mainWindow.Closing += mainWindow_Closing;
    
                    // New ViewModel.
                    mainWindow.DataContext = new ViewModels.MainWindowViewModel(mainWindow);
    
                    // Display.
                    mainWindow.Show();
                }
            }
            catch (Exception ex)
            {
                ApplicationLog.Log(ex, 22001);
    
                if (ApplicationLog.DebugMode)
                {
                    Microsoft.SqlServer.MessageBox.ExceptionMessageBox box = new Microsoft.SqlServer.MessageBox.ExceptionMessageBox(
                        ex.Message,
                        "Application",
                        Microsoft.SqlServer.MessageBox.ExceptionMessageBoxButtons.OK,
                        Microsoft.SqlServer.MessageBox.ExceptionMessageBoxSymbol.Error);
                    box.InnerException = ex;
                    box.ShowCheckBox = false;
    
                    box.Show(null);
                }
                else
                {
                    MessageBox.Show(ex.Message, "Application", MessageBoxButton.OK, MessageBoxImage.Error);
                }
    
                // Close application.
                Application.Current.Shutdown();
            }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Igor Korkhov    16 年前

    你可以使用 Process Monitor 工具来查看幕后发生了什么。至少您可以看到读取哪些文件(例如.NET程序集)、扫描哪些目录等等。您还可以取消选中vs调试器选项中的“仅我的代码”复选框,并在同一位置选中“启用.NET框架源代码步进选项”。这至少会产生更详细的堆栈跟踪。如果没有什么可以帮助你使用 WinDbg 单步执行托管代码和非托管代码。