为什么枚举文件多次返回同一个文件?

时间:2012-05-15 18:22:42

标签: c# winforms io .net

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

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

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的内容,则将其添加到Files 4次。我试着打破它指出它确定它不是我如何显示它。

我将4个物体相互比较,它们是相同的。当我稍微打开搜索条件并得到5个结果时,其中一些是1个,有些是双倍的一些三元组。所以有5个独特的结果,但总共大约10-12。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

使用Invoke。

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

答案 1 :(得分:0)

您正在直接使用枚举变量

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

Files.Clear(); //数据网格视图的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);
            }));
        }
    });

答案 2 :(得分: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());

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