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

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

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

Обратите внимание, что под связыванием я не имею в виду получение данных из источника данных. Это фактическое связывание, которое занимает больше времени, так как выполняет много массива данных. Как я могу сохранить поток пользовательского интерфейса свободным, пока детальная сетка выполняет его привязку?

Спасибо за миллион.

Ответы [ 4 ]

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

Вы не можете. Обновление пользовательского интерфейса должно выполняться в потоке пользовательского интерфейса.

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

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

Наконец я нашел решение. Решение не включает многопоточность для начала. Поскольку я сказал, что задержка была в связывании сетки, означающей, что основной поток был задержан, мы не могли сделать много Таким образом, решение состоит в том, чтобы принести задержки. Когда пользователь выбирает главную строку, таймер включается на определенное время. Если другой запрос сделан до истечения времени, таймер перезапускается. Это то, что мы игнорируем все вызовы, которые были сделаны, потому что пользователь слишком быстро щелкал или выбирал строки. Когда таймер истекает, я беру выбранную строку и отображаю данные. Простое и элегантное решение.

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

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

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

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

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

Вы можете использовать фоновый поток для выполнения поиска данных, а затем использовать поток пользовательского интерфейса для его отображения.

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