【问题标题】:Adding many items to listbox freezes UI将许多项目添加到列表框会冻结 UI
【发布时间】:2014-04-30 19:02:51
【问题描述】:

我正在制作一个在目录中查找重复文件的程序,但是当它正在搜索的目录中有太多这些文件时,它会使应用程序崩溃。 我想知道是否有办法缓冲它抓取的文件数量。 这是执行我正在解释的事情的代码:

string[] filePathsb = Directory.GetFiles(
      @"" + Dirfind, "*" + filetyperest, SearchOption.AllDirectories);

for (int i = 0; i < filePathsb.Length; i++)
   {

     ListBoxItem itm = new ListBoxItem();

     try
     {
        List<TodoItem> items = new List<TodoItem>();

        filelistboxitem.Items.Add(new TodoItem() { Title = "" + filePathsb[i], Deletea = "" + i });
     }
     catch (Exception ex)
     {
        System.Windows.Forms.MessageBox.Show("Error occurance: " + ex);
     }

}

请注意:当有大约

【问题讨论】:

  • 定义“使应用程序崩溃”。向列表框中添加 50 个甚至 200 个项目应该不会导致问题。将数千个项目添加到列表框可能是一个问题(除了糟糕的用户体验之外)。您是否遇到异常(详细信息?),程序是否锁定,或者究竟是什么?
  • 当我这样做时,我认为它不会发生任何异常:'string[] filePathsb = Directory.GetFiles(@"" + Dirfind, "*" + filetyperest, SearchOption.所有目录);'
  • 所以当我运行函数时崩溃只会让窗口冻结
  • 我同意埃里克的观点...请描述“崩溃”的发生情况。我构建了自己的 FileSync C# 应用程序,我曾经针对一个包含 7000 个文件的目录运行它,并且它没有崩溃任何东西。现在它确实冻结了应用程序,直到所有文件都被读取,所以我切换到线程以保持 UI 响应......
  • 我已根据您的 cmets 更新了您的帖子标题 - 请验证 changte 是否准确/更新。请不要将“崩溃”用作“不更新 UI/冻结” - 对于大多数读者来说,“崩溃”意味着“抛出未处理的异常”。

标签: c# buffer getfiles


【解决方案1】:

如果您将许多项目添加到 ListBox,WinForms 可能会变得非常缓慢且无响应。如果像在您的示例中那样从 UI 线程进行添加,则尤其如此。 UI 将冻结,直到添加最后一个项目。

我能做什么?

一个简单的改进就是调用

SuspendLayout();

在你的循环开始之前,并且

ResumeLayout();

循环完成后。这将减少更新列表框的成本,因此整个事情完成得更快。

如何防止完全锁定 UI?

您可以使用线程在后台更新列表。对于 WinForms,BackgroundWorker 是常用的。请注意,您不能直接从 BackgroundWorker 更新 UI,因为它们在不同的线程上运行。通常的事件机制ReportProgress 不适用于这种情况,因为您希望不断更新 UI,直到加载所有文件。相反,您可以使用此处列出的方法:

Accessing UI Control from BackgroundWorker Thread

【讨论】:

    【解决方案2】:

    尝试使用 Backgroundworker 线程查找文件。您的 UI 不会冻结,文件查找逻辑将在“后台”运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 2015-11-15
      • 2013-06-11
      相关资源
      最近更新 更多