VB.NET DataGridView загружать данные из фонового рабочего и SQLDataReader - PullRequest
1 голос
/ 28 марта 2012

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

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

Iон работает с фоновым работником и средством чтения данных, и я пытаюсь добавить строку из SQLDataReader.Read с помощью метода BackgroundWorker.ReportProgress.Технически все работает, но мерцание сумасшедшее, а форма непригодна (вероятно, не потому, что поток GUI заблокирован, а просто потому, что так много всего происходит ...)

Есть идеи?Как сделать загрузку просмотра данных "гладкой"?

1 Ответ

0 голосов
/ 28 марта 2012

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

Честно говоря, это сценарий, в котором я обнаружил, что BackgroundWorker вынуждает вас создать плохой дизайн.Что бы я сделал, это вообще отказался от BackgroundWorker и вручную создал новый Thread или Task для загрузки.Пусть ваш рабочий поток поставит в очередь строки в Queue<T> или какую-либо другую структуру данных, а затем попросит ваш поток пользовательского интерфейса периодически опрашивать эту очередь через System.Windows.Form.Timer в любой интервал, который вам больше подходит.Поток пользовательского интерфейса извлечет разумное количество строк и поместит их в сетку, чтобы он не пытался сделать слишком много, и повесил пользовательский интерфейс или слишком мало, что заняло бы вечность.

...