方法调用和方法入口(C#)之间发生了什么?

时间:2010-01-28 11:13:31

标签: c# wpf loading startup

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

在App.xaml的Application_Startup事件中,控制器被初始化。该控制器位于一个单独的“业务”程序集中,该程序集又调用“数据”程序集来收集有关用户的信息等。这个组件相对较小,160k和60k。

进入此活动所需的时间为15秒。所以我们在另一个方法中分离代码并在事件中调用它。通过此更改,我们发现调试器在启动后直接进入Application_Startup事件。但是,从它到达调用分离方法的行并进入此方法再次花费15秒。

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

  1. 有没有办法在方法调用之后和输入方法之前查看发生了什么?
  2. 在15秒的时间段内加载方法需要装配吗?如果是的话,有什么方法可以缩短这个时间?
  3. 提前感谢您的回复。

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

            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 个答案:

答案 0 :(得分:1)

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