Как мне профиль ShowDialog?

Я взял на себя проект Keyboard hook и немного улучшил его. Раньше было всего 4 формы, которые имели всю логику и математику в этих 4 файлах. Итак, МНОГИЕ часы спустя я почти собрал программу после разделения всего. Последний момент - использование концепции дизайна Model-View-Presenter в главном окне. Все мои тесты отлично работают на моей машине, и, естественно, программа работает так, как должна на целевых компьютерах.

Целевые компьютеры - простые процессоры Intel Atom x86 с оперативной памятью 2 ГБ. На них есть кнопки, которые соответствуют F13-F18 на клавиатуре (именно здесь вступает в действие моя программа с подключением клавиатуры). Мой компьютер для разработки - это полустойкий 6-ядерный компьютер AMD x64 с 8 ГБ ОЗУ. Одна вещь, которую я хотел сделать, это проверить способ установки этих функциональных кнопок для конкретной задачи. Все мои юнит-тесты проходят на эту часть. Когда я нажимаю на новый тип задачи, он работает как нужно.

"Круто", говорю я, "давайте посмотрим на это в действии", поэтому я нажал "запустить" в Visual Studio. В моей программе F9-F12 есть ключи для подключения. Теперь окно назначений открывается только при нажатии одной из подключенных клавиш, когда главное окно открыто. Если это главное окно не открыто, то задача выполняется. Поэтому я открываю свое главное окно и нажимаю F9, и открывается окно "Назначение", но я не могу ничего нажимать в течение 4 секунд. Затем он "догоняет" и делает то, на что я нажимал. Я подумал, что, может быть, это мой отладчик, поэтому я пошел в папку bin и запустил приложение напрямую, и это же сделка.

Я подумал, что, может быть, это была проблема с разрешениями, поэтому я работал с правами администратора и с той же проблемой Я задавался вопросом, насколько плохо это будет на целевых компьютерах. Я скопировал папку bin на флэш-диск, скопировал содержимое в Program Files и запустил его. Это работало отлично (в определенной степени), но проблемы не было. Я могу выбрать любую задачу сразу после того, как диалоговое окно станет видимым.

Одна странная вещь заключается в том, что моя клавиатура перестал работать после 11 раз попытки переназначить ее... но это отдельный вопрос. Поэтому я подумал, что помню, как кто-то говорил, используйте профилировщик. Ну, у моей визуальной студии была такая, поэтому я включил ее, но я не могу сделать ни головы, ни хвост возвращаемых данных. Я бы отправил код, но я не знаю, что писать. Я даже дошел до использования System.Console.Write("."); вокруг области, которую я думал, была проблема, но это не было проблемой

protected override void theHook_RegisteredKeyPressed(System.Windows.Forms.Keys key)
{
    if (TakeOver)
    {
        if (!Busy)
        {
            busy = true;
            LibraryTrace.Start("NewKeyAssignment", key);
            using (var window = new AssignmentTypePanel())
            {
                presenter = new TaskPresenter(window, theList[key].Task);
                window.Presenter = presenter;
                //execution will not continue past here until window is closed
                window.ShowDialog();
            }
            theList[key] = new TaskKey(key, presenter.Task);
            LibraryTrace.End("NewKeyAssignment", theList[key].Task.ToString());
            busy = false;
        }
   }
   else
   {
       base.theHook_RegisteredKeyPressed(key);
   }
}

Так что я застрял. Я не могу понять, что печатать, что спрашивать. Любые советы о том, как я могу найти корень этой проблемы?

1 ответ

У меня была похожая проблема с приложением, которое я разработал с использованием winforms - операция на стороне сервера была молниеносной, но форма, показывающая результаты, показала ~5 секунд.
После расследования выясняется, что у winforms есть некоторые известные проблемы с производительностью.
Есть несколько предложений по оптимизации (как здесь или здесь, так и несколько других, которые я нашел в то время, но сейчас не могу их найти).

На самом деле, ни один из них не помог в моем случае.
Я понял, что настоящее узкое место - это создание и отображение новой формы; то, что я закончил, было чем-то вроде
Я поместил ВСЕ свои элементы управления в основную форму, некоторые из которых были скрыты, и имитировал изменение форм, скрывая некоторые элементы управления и отображая другие.
Это довольно уродливо, и не будет увеличиваться, но в моем случае сработало очень хорошо.

Другие вопросы по тегам