Загрузка таблицы данных при загрузке формы, как ускорить ее в c#

#c# #.net #database #winforms #.net-3.5

#c# #.net #База данных #winforms #.net-3.5

Вопрос:

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

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

как я могу ускорить это, я готов выполнять потоковую обработку, если она выполняет свою работу.

Комментарии:

1. Является ли использование jQuery опцией? Вы можете сделать все это (асинхронную загрузку таблицы и изображения загрузчика) с помощью jQuery. Сколько строк из этих 1000 вы хотите отобразить на странице, если вам нужен только выбор, вы можете использовать pageddatasource

2. @Ivo, это winforms, а не html / web — так что никакого jQuery.

3. @Ivo: смотрите

4. извините, было слишком много в моем «собственном» мире, но я думаю, что pagedatasource все еще является вариантом

5. Выполняете ли вы какое-либо форматирование в DataGridView? Обычно извлечение нескольких тысяч записей из серверной части должно выполняться менее чем за секунду.

Ответ №1:

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

Вот некоторые документы:

Класс потока MSDN

И несколько примеров кода:

 Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();
  

Где ThreadProc должен быть вашим методом загрузки данных.

Позвольте мне уточнить немного больше:

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

Комментарии:

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

2. @Hammerstein Приятно указать, я отредактировал ответ, чтобы включить это.

Ответ №2:

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

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

Ответ №3:

Вам придется использовать класс BackgroundWorker.

Ответ №4:

используйте компонент backgroundworker. С этим проще справиться, чем с потоковой обработкой, в качестве альтернативы вы можете использовать асинхронные методы, предоставляемые ado.net например, beginexecutereader и т. д

Ответ №5:

Вы можете использовать асинхронные запросы в сочетании с частичными результатами.

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