2010-01-28 71 views
3

目前我们遇到了一个中型WPF应用程序启动的问题。大约需要15秒才能完成加载。我们想知道这需要多久。方法调用和方法入口(C#)之间发生了什么?

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

输入此事件花费的时间为15秒。所以我们用另一种方法分离代码并在事件中调用它。通过这一改变,我们发现调试器在启动后直接进入Application_Startup事件。但是,从它到达调用分离方法的行并进入这个方法的时间,它又花了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(); 
     } 
+0

你能提供一个分开的方法的片段,看看它在做什么?什么是后端数据库? – curtisk 2010-01-28 13:47:52

+0

上面的帖子是用分离的方法编辑的,后端的数据库是一个Oracle数据库......但是,无法想象它没有首先到达初始化连接到数据库的代码就访问它,对吗? – 2010-01-28 15:38:32

回答

1

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

+0

似乎优化应用程序需要很长时间(过程分析)。谢谢。 – 2010-02-03 10:44:14

相关问题