【发布时间】:2009-05-27 19:03:37
【问题描述】:
我正在使用 file.readalllines 将文件读入字符串,然后使用 listbox.items.addrange 并通过 vbcrlf 拆分来插入项目。有没有办法减少加载大量列表时造成的延迟?
【问题讨论】:
标签: .net vb.net winforms listbox
我正在使用 file.readalllines 将文件读入字符串,然后使用 listbox.items.addrange 并通过 vbcrlf 拆分来插入项目。有没有办法减少加载大量列表时造成的延迟?
【问题讨论】:
标签: .net vb.net winforms listbox
鉴于文件大到足以通过原子读取它导致无响应,看来您应该在单独的线程中进行读取。
线程池项应该在这里完成工作。试试这个:
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,它旨在在UI 应用程序的后台执行长时间的任务。但是,我不确定它在这种情况下是否有任何优势,一个简单的线程池项会明显更简单,并允许您内联执行所有操作。
【讨论】:
使用 BeginUpdate 和 EndUpdate 方法;这将暂时禁用列表框的重绘,并可以加快填充它的过程。
ListBox1.BeginUpdate()
' fill the list using Items.Add or Items.AddRange '
ListBox1.EndUpdate()
【讨论】:
您可以尝试使用另一个线程来填充列表框。这将避免“挂起”,让用户与另一个表单控件进行交互。 您也可以部分加载元素,而不是一次加载所有数据。
【讨论】:
使用 BackgroundWorker 并在单独的线程中加载文件。小心将行从线程添加到 ListBox。您需要从正确的线程发布项目。
【讨论】:
file.readalllines 将文件读入字符串
不! File.ReadAllLines 读入一个字符串数组。
vbcrlf 分割
所以这已经为您完成了:您正在白白做一堆额外的工作。
【讨论】:
虽然您可能希望将数据读入另一个线程中的字符串数组,但我建议填充 ListBox 可能应该是 UI 线程上的单个操作。如果项目的数量如此之大,以至于仅使用 AddRange 填充 ListBox 的延迟是不可接受的,那么用户似乎不太可能一开始就能够有效地与控件进行交互。
【讨论】: