Отдельный поток пользовательского интерфейса для просмотра деталей с использованием WinForms - PullRequest
2 голосов
/ 21 октября 2009

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

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

Создание формы в отдельном потоке относительно просто, так как Application.Run принимает параметр формы.

Есть ли способ запустить элемент управления winforms в отдельном потоке? Я знаю, что у родных окон в разных потоках могут быть отношения родитель / потомок, но я не знаю, как их настроить с помощью winforms.

ТИА,

Ответы [ 4 ]

2 голосов
/ 21 октября 2009

Обновление пользовательского интерфейса из вторичного потока
http://msdn.microsoft.com/en-us/magazine/cc188732.aspx

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

2 голосов
/ 21 октября 2009

Замедление вызвано загрузкой данных или заполнением самого пользовательского интерфейса?

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

1 голос
/ 22 октября 2009

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

this.SuspendLayout();

// Do control stuff here

this.ResumeLayout();

Если это не поможет, попробуйте это:

[DllImport("user32.dll")]

public static extern bool LockWindowUpdate(IntPtr hWndLock);
//
LockWindowUpdate(this.Handle);

// Do control stuff here

this.Refresh(); //Forces a synchronous redraw of all controls

LockWindowUpdate(IntPtr.Zero);

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/8a5e5188-2985-4baf-9a0e-b72064ce5aeb

1 голос
/ 21 октября 2009

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

Это дает пользователю 1/2 секунды для перехода к следующей записи без обновления представления информации вообще.

...