Динамические компоненты Windows Forms (проблема с производительностью) - PullRequest
4 голосов
/ 26 апреля 2010

У меня проблема с производительностью моего кода в Windows Forms. Имеют форму, ее компоновка зависит от данных конструктора, потому что компоновка должна быть OnLoad или Constructor.

I поколение простое, базовые FlowLayoutPanel имеют другие FlowLayoutPanels, для каждого есть Label и TextBox с DataBinding.

Проблема в том, что это ОЧЕНЬ МЕДЛЕННО, до 20 секунд, я рисую менее 100 элементов управления, из Performace Session Я знаю, что проблема в 70% обработки функций:

  1. System.Windows.Forms.Control.ControlCollection.Add (класс System.Windows.Forms.Control)
  2. System.Windows.Forms.ControlBindingsCollection.Add (класс System.Windows.Forms.Binding)

Как я могу это сделать? Кто-нибудь поможет мне в этой проблеме? Как решить проблему с динамическим макетом формы?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010

Вы отключили макет при добавлении элементов управления?

        panel.SuspendLayout();
        try
        {
            // add controls in a loop/etc here
        }
        finally
        {
            panel.ResumeLayout();
        }
2 голосов
/ 26 апреля 2010

Я недавно прочитал эту статью, в которой есть масса идей по оптимизации производительности в приложениях .Net Winforms. MSDN Артикул

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

Вы можете сделать это с помощью класса Background Worker.

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

"Операции, которые должны быть выполнены, но не нужны для отображения первого «Пользовательский интерфейс может быть выполнен во время простоя системы или по требованию после отображения первого пользовательского интерфейса. «Например, если у вас есть TabControl, запустите только самую верхнюю страницу при запуске "и при необходимости извлекать информацию для других страниц."

...