VB.NET: есть ли способ уменьшить задержку загрузки огромного списка текстовых строк в список? - PullRequest
0 голосов
/ 27 мая 2009

Я использую file.readalllines для чтения файла в строку, затем использую listbox.items.addrange и разбиение vbcrlf для вставки элементов. Есть ли способ уменьшить задержку загрузки огромных списков?

Ответы [ 6 ]

4 голосов
/ 27 мая 2009

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

Здесь должен работать элемент пула потоков. Попробуйте это:

ThreadPool.QueueUserWorkItem((state) =>
     using(var streamReader = new StreamReader("foo.txt"))
     {
         string line;
         while ((line = streamReader.ReadLine()) != null)
             listBox.Invoke(() => listBox.Items.Add(line));
     })

(Мой VB.NET немного заржавел, поэтому, если кто-то сможет это преобразовать, это будет полезно.)

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

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

1 голос
/ 27 мая 2009

file.readalllines для чтения файла в строку

Нет! File.ReadAllLines считывает в строку массив .

расщепление по vbcrlf

Так что это уже сделано для вас: вы делаете кучу дополнительной работы даром.

1 голос
/ 27 мая 2009

Используйте BackgroundWorker и загружайте файл в отдельном потоке. Будьте осторожны при добавлении строк в ListBox из потока. Вам нужно будет отправить элементы из правильной темы.

1 голос
/ 27 мая 2009

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

1 голос
/ 27 мая 2009

Используйте методы BeginUpdate и EndUpdate; это временно отключит перерисовку списка и может ускорить процесс его заполнения.

ListBox1.BeginUpdate()
' fill the list using Items.Add or Items.AddRange '
ListBox1.EndUpdate()
0 голосов
/ 10 июня 2011

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

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