В настоящее время я работаю над проектом, в котором у нас есть пара очень мощных пользовательских элементов управления, которые используются внутри контроллера MDI. Это приложение Line of Business, ориентированное на данные.
Проблема, с которой мы столкнулись, заключалась в том, что вышеупомянутые элементы управления загружались очень очень медленно, мы опускали наши пальцы в воды многопоточности для контрольной нагрузки, но это не было решением по ряду причин. Наше решение для повышения производительности элементов управления в конечном итоге заключалось в том, чтобы «предварительно загрузить» формы в скрытое окно, создать стек существующих форм и выскочить из стека, когда пользователь запросил форму.
Теперь текущая проблема, с которой я столкнулся, возникнет, когда мы отправим это «исправление» нашим тестировщикам, и, в конечном счете, нашим пользователям это:
В настоящее время «скрытое» окно, содержащее предварительно загруженные формы, отображается в диспетчере задач и может быть закрыто, что приведет к потере всех элементов управления. Тогда вы должны создавать их на лету, теряя прирост производительности. Во-вторых, когда пользователь использует стек, мы теряем повышение производительности (текущее решение этого вопроса обсуждается ниже).
Для первой проблемы, есть ли способ скрыть это окно от диспетчера задач, возможно, путем создания родительской формы, которая инкапсулирует как основную форму для программы, так и скрытую форму?
Наше текущее решение второй проблемы заключается в том, чтобы иметь таймер неактивности, который при запуске проверяет стеки для форм и загружает новую форму в стек, если она не заполнена. Однако это все еще может вызвать зависание пользовательского интерфейса при создании форм. Возможные решения для этого - положить «использованные» формы обратно в стек, но я чувствую, что может быть лучший способ.
РЕДАКТИРОВАТЬ: Для уточнения конструкции управления
Из комментариев, которые я понял, недостаточно ясно, что именно делает элемент управления.
Вот подробное объяснение одного из элементов управления.
Я определил для этого времени загрузки элемента управления время, которое требуется от того момента, когда пользователь выполняет действие, открывающее элемент управления, до времени, когда элемент управления доступен для редактирования.
Элемент управления предназначен для ввода предписаний для пациента в системе, он имеет около 5 групп с вкладками и всего около 180 элементов управления. Пользователь выбирает открыть новый элемент управления Prescription из основной программы, этот элемент управления загружается в дочернюю область MDI главной формы (которая является элементом управления DevExpress Ribbon). С момента, когда пользователь нажимает кнопку Создать (или загружает существующую запись), до тех пор, пока элемент управления не станет видимым. Список действий, которые происходят в программе, таков:
Стек проверяется на наличие элемента управления.
Если элемент управления существует, он извлекается из стека.
Элемент управления отображается на экране. Это то, что занимает 2 секунды
Затем элемент управления заполняется пустым объектом или существующими данными.
Элемент управления готов к использованию.
Средний процент времени загрузки, на 10 разных машинах, при различном оборудовании рендеринг управления занимает от 85 до 95 процентов времени загрузки управления.
Без использования стека элемент управления загружается примерно за 2 секунды, а со стеком - около 0,8 секунды, этот второй раз приемлем.
Я посмотрел ссылку Генри и ранее уже применил соответствующие предложения.
Опять я повторяю свой вопрос: Каков наилучший метод перемещения элементов управления в стек и из стека с минимальным прерыванием пользовательского интерфейса?