Что происходит между вызовом метода и записью метода (C #)? - PullRequest
3 голосов
/ 28 января 2010

На данный момент у нас проблема с запуском WPF-приложения среднего размера. Для полной загрузки требуется около 15 секунд. Мы задавались вопросом, что это займет так долго.

В случае Application_Startup из App.xaml контроллер инициализируется. Этот контроллер находится в отдельной «бизнес-сборке», которая, в свою очередь, вызывает сборку «данных» для сбора информации о пользователе и так далее. Эти сборки относительно малы, 160 тыс. И 60 тыс.

Время, необходимое для входа в это событие, составило 15 секунд. Поэтому мы разделили код в другом методе и вызвали его в событии. С этим изменением мы обнаружили, что отладчик вводит событие Application_Startup сразу после запуска. Однако с момента, когда он достигает линии, которая вызывает разделенный метод и входит в эти методы, снова потребовалось 15 секунд.

В этот период времени ничего не происходило в окне вывода или стека вызовов Visual Studio. Итак, вопросы:

  1. Есть ли способ узнать, что происходит после вызова метода и до входа в метод?
  2. Нужны ли сборки при загрузке метода в этот период 15 секунд? Если это правда, как сократить это время?

Заранее спасибо за ответы.

edit, запрошенный код разделенного метода:

        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 Ответ

1 голос
/ 28 января 2010

Вы можете использовать Process Monitor , чтобы увидеть, что происходит за кулисами. По крайней мере, вы можете увидеть, какие файлы (например, сборки .NET) читаются, какие каталоги сканируются и так далее. Вы также можете снять флажок «Просто мой код» в параметрах отладчика VS и установить «Включить опцию пошагового изменения исходного кода .NET Framework» там же. Это даст как минимум более детальную трассировку стека. Если ничего не помогает, вы можете использовать WinDbg для пошагового выполнения как управляемого, так и неуправляемого кода.

...