我有这段代码(感谢那些迄今为止一直在帮助的人)
它搜索目录和所有子目录以查找文件名。
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。
我做错了什么?
答案 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());
为什么最初使用所有异步操作?