Оптимизация скорости приложения Windows Forms - PullRequest
3 голосов
/ 16 февраля 2009

Как ускорить оптимизацию приложений Windows Forms?

Я не говорю о очевидных методах оптимизации .NET - таких как NGEN -ing, кеширование объектов и т. Д. Я уже пробовал это, и я собираюсь сократить время инициализации формы с 1500 мсек до 500 мсек.

Профилирование идентифицировало самый медленный код, и почти весь он находится в InitializeComponent, а в этом методе самые медленные строки -

  1. создание (только что появившегося) компонента WebBrowser
  2. загрузка иконки с ресурса (отвратительно 500 мсек)
  3. создание ContextStripMenu
  4. несколько this.Controls.Add() звонков также вносят большой вклад.

В настоящий момент я могу видеть только то, как исправить точку (2) - переместить данные значков из сохраненного в качестве встроенного ресурса в закрытое поле (например, строку, кодированную Base64 ).

Что мне делать с пунктами 1, 3 и 4?

Ответы [ 6 ]

1 голос
/ 16 февраля 2009

Загрузить значок в отдельном потоке InitializeComponentAsync.

1 голос
/ 16 февраля 2009

Единственное, что я могу думать о том, что вы можете сделать, - это переписать элементы управления, которые вы хотите использовать, и оптимизировать их для более быстрой инициализации (а также класс Form для оптимизации добавления элементов управления в форму). .

Я не могу понять, насколько это возможно, и я думаю, что вы застрянете с этим, в зависимости от вашей зависимости от этих элементов управления.

0 голосов
/ 17 марта 2009

Одна из техник, которую я использовал в прошлом, состояла в многопоточности загрузки данных, чтобы она выполнялась одновременно с созданием формы. В этом случае данные загружались из AD, они сокращали около 1/3 времени загрузки.

0 голосов
/ 17 марта 2009

Я изменил стратегию загрузки формы, это сильно изменит время загрузки формы, теперь это занимает в среднем 37 мс вместо 466 мс.

Метод: При первом щелчке на верхней вкладке / значке приложение загружает все формы под этой вкладкой / значком, а при щелчке на значке формы оно только переключает видимость. И снова посещение Top-tab не загрузит форму под этой вкладкой.

0 голосов
/ 06 марта 2009
  1. Просто возьми другой класс, как ClsAppearance.cs, как я взял.

  2. Инициализировать все элементы управления, такие как

    static Infragistics.Win.Appearance txtBoxMidAppr = null;
    

    Я беру свое собственное имя как txtBoxMidAppr вместо appiarance1. Из-за этого можно использовать для всех текстовых полей, только один раз инициализации.

  3. Создайте функцию, в которой мы можем инициализировать внешний вид и вызывать ее при загрузке формы MDI / Main только один раз.

    public static void LoadAll()
    {
        txtBoxMidAppr = new Infragistics.Win.Appearance();
    }
    
  4. Сделайте еще одну функцию здесь и возьмите код внешнего вида из окна проектирования

    public static Infragistics.Win.Appearance App_txtBoxMidAppr //text_box_small
    {
        get 
        {
            txtBoxMidAppr.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(93)))), ((int)(((byte)(93)))), ((int)(((byte)(93)))));
            txtBoxMidAppr.ImageBackground = global::CS_POS.Properties.Resources.text_box_small;
            txtBoxMidAppr.ImageBackgroundStyle = Infragistics.Win.ImageBackgroundStyle.Stretched;
            txtBoxMidAppr.ImageHAlign = Infragistics.Win.HAlign.Right;
            return txtBoxMidAppr;
        }
    }
    
  5. В коде проектирования формы прокомментируйте все настройки внешнего вида текстового поля и введите имя функции для получения внешнего вида из ClsAppearance.cs класса

    //appearance4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(93)))), ((int)(((byte)(93)))), ((int)(((byte)(93)))));
    //appearance4.ImageBackground = global::CS_POS.Properties.Resources.text_box_small;
    //appearance4.ImageBackgroundStyle = Infragistics.Win.ImageBackgroundStyle.Stretched;
    //appearance4.ImageHAlign = Infragistics.Win.HAlign.Right;
    this.uteNABoth.Appearance = CS_POS.App_Appearance.ClsAppearance.App_txtBoxMidAppr;
    

    возьмите все элементы управления и создайте функцию в классе и вызовите ее оттуда.

Таким образом, инициализация внешнего вида будет выполняться только один раз и может использоваться много раз.

0 голосов
/ 16 февраля 2009

Можете ли вы сделать ленивую загрузку для вашего элемента управления Webbrowser? Если это вкладка, которая не является основным видом, вы можете загрузить веб-браузер, когда эта вкладка активирована.

Или вы можете загрузить форму, а затем загрузить веб-браузер (это может помочь вам сначала показать что-то, а затем показать все, как вы это делаете на веб-сайте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...