向列表框中添加许多项目会冻结UI

本文关键字:项目 冻结 UI 许多 添加 列表 | 更新日期: 2023-09-27 18:00:55

我正在制作一个程序,它可以在目录中找到重复的文件,但当它搜索的目录中有太多这样的文件时,会导致应用程序崩溃。我想知道是否有一种方法可以缓冲它抓取的文件量。以下是我正在解释的代码:

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个文件。

向列表框中添加许多项目会冻结UI

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

我能做什么

一个简单的改进是调用

SuspendLayout();

在循环开始之前,

ResumeLayout();

循环完成后。这将降低更新列表框的成本,从而使整个过程更快地完成。

如何防止完全锁定UI

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

从BackgroundWorker线程访问UI控件

尝试使用Backgroundworker线程查找文件。然后UI不会冻结,文件查找逻辑将在"后台"中运行