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

时间:2014-04-30 19:02:51

标签: c# buffer getfiles

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

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);
     }

}

只需注意:当有大约&lt; 50个文件。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如果向ListBox添加许多项,WinForms可能变得非常慢并且没有响应。如果在您的示例中,您从UI线程进行添加,则尤其如此。用户界面将冻结,直到添加最后一项。

我该怎么办?

一个简单的改进就是打电话

SuspendLayout();
在循环开始之前

ResumeLayout();
循环完成后

。这将降低更新列表框的成本,因此整个过程更快完成。

如何防止完全锁定用户界面?

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

Accessing UI Control from BackgroundWorker Thread