【问题标题】:VB.NET: Is there a way to reduce the lag of loading a huge list of text lines to a listbox?VB.NET:有没有办法减少将大量文本行加载到列表框的延迟?
【发布时间】:2009-05-27 19:03:37
【问题描述】:

我正在使用 file.readalllines 将文件读入字符串,然后使用 listbox.items.addrange 并通过 vbcrlf 拆分来插入项目。有没有办法减少加载大量列表时造成的延迟?

【问题讨论】:

    标签: .net vb.net winforms listbox


    【解决方案1】:

    鉴于文件大到足以通过原子读取它导致无响应,看来您应该在单独的线程中进行读取。

    线程池项应该在这里完成工作。试试这个:

    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 应用程序的后台执行长时间的任务。但是,我不确定它在这种情况下是否有任何优势,一个简单的线程池项会明显更简单,并允许您内联执行所有操作。

    【讨论】:

      【解决方案2】:

      使用 BeginUpdate 和 EndUpdate 方法;这将暂时禁用列表框的重绘,并可以加快填充它的过程。

      ListBox1.BeginUpdate()
      ' fill the list using Items.Add or Items.AddRange '
      ListBox1.EndUpdate()
      

      【讨论】:

      • 这将有助于提高速度,但当然不会提高响应速度。如果文件足够大,那么这样做没有任何意义。
      【解决方案3】:

      您可以尝试使用另一个线程来填充列表框。这将避免“挂起”,让用户与另一个表单控件进行交互。 您也可以部分加载元素,而不是一次加载所有数据。

      【讨论】:

        【解决方案4】:

        使用 BackgroundWorker 并在单独的线程中加载文件。小心将行从线程添加到 ListBox。您需要从正确的线程发布项目。

        【讨论】:

          【解决方案5】:

          file.readalllines 将文件读入字符串

          不! File.ReadAllLines 读入一个字符串数组

          vbcrlf 分割

          所以这已经为您完成了:您正在白白做一堆额外的工作。

          【讨论】:

          • 是的,那是我想知道他到底在做什么的部分:)
          【解决方案6】:

          虽然您可能希望将数据读入另一个线程中的字符串数组,但我建议填充 ListBox 可能应该是 UI 线程上的单个操作。如果项目的数量如此之大,以至于仅使用 AddRange 填充 ListBox 的延迟是不可接受的,那么用户似乎不太可能一开始就能够有效地与控件进行交互。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-05-26
            • 2020-05-29
            • 2012-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多