Учитывая, что файл достаточно велик для того, чтобы вызывать невосприимчивость при его атомарном чтении, может показаться, что вы должны выполнять чтение в отдельном потоке.
Здесь должен работать элемент пула потоков. Попробуйте это:
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
, который предназначен для выполнения длинных задач в фоновом режиме в приложениях пользовательского интерфейса. Однако я не уверен, что это дает какие-либо преимущества в этом случае, и простой элемент пула потоков был бы значительно проще и позволял бы делать все встроенное.