2009-12-03 2 views
0

У меня возникла проблема с form.Show() в C# .NET Framework 2.0.C# .NET form.Show() очень медленный

//segment code (FormA's caller) 
    FormA frmA = new FormA(); 

    writeLog("Begin: " + Environment.TickCount); 
    frmA.SuspendLayout(); 
    frmA.Show(); 
    frmA.ResumeLayout(); 
    writeLog("End: " + Environment.TickCount); 

    .... 



    //segment code (FormA) 
    private void FormA_Load(object sender, EventArgs e){ 
     writeLog("Begin - Load: " + Environment.TickCount); 
    } 

Из кода выше кода я создаю в режиме деблокирования и выполняю его. Я нашел разное время между «Begin:» и «Begin-Load» около 2 - 3 секунд на моем ноутбуке (Windows XP x86), но другое время на сервере (Windows 2003 SP2) составляет более 5 секунд. Я не знаю почему.

Кроме того, FormA много TableLayout и UserControl (всего управления приблизительных 800)

+0

«Я не знаю, почему». Это потому, что 800 - это огромное количество элементов управления для инициализации! – overslacked

+0

В этом случае я вызываю конструктор формы InitializeComponent, но почему .show() в form_load занимает много времени –

ответ

3

Если вы профилированного и оптимизировали форму, вы, возможно, придется использовать курсор ожидания, заставки или индикатор.

Если вы НЕ профилировали, я настоятельно рекомендую вам это сделать. Могут быть несколько методов, которые съедают много времени.

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

Edit:

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

0

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

Или еще лучше. Если у вас есть вкладки в форме, возможно, вы можете перенести загрузку элементов управления, когда вкладка впервые фокусируется на фокусе. Только загружать tose cotrols, которые будут видимы пользователю при запуске, а затем загрузить остальные по запросу.

2

Профиль вашего компонента компонента инициализации. У вас есть собственные средства управления? Сторонние? Некоторые из них, как известно, медленно отдают. Вы устанавливаете источник данных для любого из элементов управления? Заполнение элемента управления элементами во время разработки? Попробуйте переместить их после загрузки страницы.

И да, 800 элементов управления - это страница. Это просто плохо спроектированная страница. Исправьте это в первую очередь.

+0

Да, у меня есть мои элементы управления и некоторые элементы управления для отображения TIFF image –

+1

+1 Да, 800 огромен. Я надеюсь, что OP поймет, что после профилирования. –