C# 向列表框添加许多项会冻结用户界面

C# 向列表框添加许多项会冻结用户界面,c#,buffer,getfiles,C#,Buffer,Getfiles,我正在制作一个在目录中查找重复文件的程序,但是当它正在搜索的目录中有太多的文件时,它会使应用程序崩溃。 我想知道是否有一种方法可以缓冲它获取的文件量。 下面是我要解释的代码: string[] filePathsb = Directory.GetFiles( @"" + Dirfind, "*" + filetyperest, SearchOption.AllDirectories); for (int i = 0; i < filePathsb.Length; i++)

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

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

}
string[]filePathsb=Directory.GetFiles(
@“+Dirfind,*”+filetyperest,SearchOption.AllDirectories);
for(int i=0;i

请注意:当大约有<50个文件时,这可以正常工作。

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

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

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

我能做什么?

一个简单的改进是调用

SuspendLayout();
在循环开始之前,以及

ResumeLayout();
循环完成后。这将降低更新列表框的成本,因此整个过程完成得更快

如何防止完全锁定UI?

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


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

我能做什么?

一个简单的改进是调用

SuspendLayout();
在循环开始之前,以及

ResumeLayout();
循环完成后。这将降低更新列表框的成本,因此整个过程完成得更快

如何防止完全锁定UI?

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


定义“使应用程序崩溃”。向列表框中添加50个项目,甚至200个项目,应该不会引起问题。向列表框中添加数千项可能是一个问题(除了用户体验不佳之外)。您是否收到异常(详细信息?),程序是否锁定,或者具体是什么?我认为在执行此操作时不会发生异常:“string[]filePathsb=Directory.GetFiles(@“+Dirfind,*”+filetyperest,SearchOption.AllDirectories);”所以当我运行函数时,崩溃只会使窗口冻结我同意Eric。。。请描述发生的“崩溃”。我构建了自己的FileSync C#应用程序,有一次我对一个目录运行它,该目录中大约有7000个文件,它没有崩溃任何东西。现在它确实冻结了应用程序,直到所有的文件都被读取,所以我切换到线程来保持UI响应…我已经根据你的评论更新了你文章的标题-请验证changte是否准确/更新。请不要使用“崩溃”作为“不更新UI/冻结”-“崩溃”对于大多数读者来说意味着“抛出未经处理的异常”。定义“崩溃应用程序”。向列表框中添加50个项目,甚至200个项目,应该不会引起问题。向列表框中添加数千项可能是一个问题(除了用户体验不佳之外)。您是否收到异常(详细信息?),程序是否锁定,或者具体是什么?我认为在执行此操作时不会发生异常:“string[]filePathsb=Directory.GetFiles(@“+Dirfind,*”+filetyperest,SearchOption.AllDirectories);”所以当我运行函数时,崩溃只会使窗口冻结我同意Eric。。。请描述发生的“崩溃”。我构建了自己的FileSync C#应用程序,有一次我对一个目录运行它,该目录中大约有7000个文件,它没有崩溃任何东西。现在它确实冻结了应用程序,直到所有的文件都被读取,所以我切换到线程来保持UI响应…我已经根据你的评论更新了你文章的标题-请验证changte是否准确/更新。请不要使用“崩溃”作为“不更新UI/冻结”-“崩溃”对于大多数读者意味着“抛出未经处理的异常”。