2014-02-03 5 views
0

У меня есть метод, называемый GetAllRecords(), который будет возвращать данные 200K записей. Когда я проверил, потребовалось около 5 секунд, чтобы загрузить данные в datagrid, и окно застыло.Как отобразить индикатор выполнения при загрузке данных в DataGridview?

DataTable dt = Records.GetAllRecords(); 

Я знаю, что я должен использовать Фоновый контроль рабочий, и это три события, но я не могу figureout, как использовать их должным образом. Например, индикатор прогресса должен показывать реальный прогресс не поддельный. Я мог бы замедлить индикатор выполнения, используя sleep() класса thread, но это будет поддельный индикатор выполнения.

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

  2. До того, как .NET 2.0 не было управления рабочим фоном, в те дни, как программист писал реальные бары прогресса?

благодаря

+0

Возможно, вам следует изучить следующее сообщение http://stackoverflow.com/questions/1470927/c-sharp-winform-progressbar-and-backgroundworker, также на следующем сайте описывается очень простой пример http: //www.dotnetperls .com/прогрессбар – Schuere

ответ

2

Если вы делаете поиск сайта, а также Google, вы увидите, что есть несколько попыток сделать это:

SO Link

MSDN Link

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

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

Pre-BackgroundWorker

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

0

Для основы о том, как реализовать BackgroundWorker и ProgressBar вы можете проконсультироваться примеры, приведенные на страницах MSDN для ProgressBar и BackgroundWorker

Что касается фактически делает процентное заполненную-свойство вашего ProgressBar имело смысл, ключ заключается в нахождении значимой ценности для использования в качестве аргумента для BackgroundWorker.ReportProgress (int). Как вы, наверное, заметили, в большинстве руководств и примеров люди обычно просто делают Thread.Sleep (100) внутри цикла for от 1 до 100, а затем отправляют переменную итерации в качестве аргумента ReportProgress.

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

Смежные вопросы