1

我有这个代码(感谢那些迄今为止一直在帮助的人)

它搜索目录和所有子目录以查找文件名。

Files.Clear(); //BindingList<FileInfo> Datasource for a datagridview

Task.Factory.StartNew( () =>
    {
       DirectoryInfo dir = new DirectoryInfo(MainFolder);

       foreach(var file in dir.EnumerateFiles("*" + textBox1.Text + "*.doc?", SearchOption.AllDirectories).Take(200))
       {
          this.BeginInvoke( new Action(() =>
             {
                Files.Add(file);
             }));
       }
     });

问题是,如果我设置textBox1.text为我知道只有 1 个的东西,它会将其添加到Files4 次。我尝试中断指向它以确保它不是我显示它的方式。

我将这 4 个对象相互比较,它们是相同的。当我稍微打开搜索条件并获得 5 个结果时,其中一些是 1,一些是两倍,一些是三倍。所以有 5 个独特的结果,但总共有 10-12 个。

我究竟做错了什么?

4

3 回答 3

1

使用调用。

您的 lambda 正在捕获正在变异的变量文件。您不仅会得到重复文件,还会丢失文件。

于 2012-05-15T18:26:29.143 回答
0

您直接使用枚举变量

如果将变量复制到局部变量,应该没问题

文件.清除();//datagridview的BindingList数据源

    Task.Factory.StartNew( () =>
    {
        DirectoryInfo dir = new DirectoryInfo(MainFolder);
        foreach(var file in dir.EnumerateFiles("*"+textBox1.Text+"*.doc?",SearchOption.AllDirectories).Take(200))
        {
            var currentFile = file;
            this.BeginInvoke( new Action(() =>
            {
                Files.Add(currentFile);
            }));
        }
    });
于 2012-05-15T18:28:54.083 回答
0

这应该工作得更快并且有更好的清晰度。

var searchPattern = "*" + textBox1.Text + "*.doc?";
Files.Clear(); //BindingList<FileInfo> Datasource for a datagridview
DirectoryInfo dir = new DirectoryInfo(MainFolder);
Files.AddRange(dir.EnumerateFiles(searchPatten, SearchOption.AllDirectories).ToList());

为什么最初您使用所有异步操作?

于 2012-05-15T18:51:24.243 回答