2012-05-15 33 views
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中,它增加了它Files 4倍。我試圖指出它不是在我如何顯示它。

我比較了4個對象,他們是相同的。當我稍微打開搜索標準並得到5個結果時,其中一些是1,一些是雙倍的三倍。所以有5個獨特的結果,但總共有10-12個。

我在做什麼錯?

回答

1

使用調用。

您的lambda捕獲正在被突變的變量文件。你不僅得到重複,你還缺少文件。

+0

你可以更清楚一點,我沒有寫出大部分上面的代碼,而當我玩它時,它變得更有意義,你能告訴我文件變量在哪裏變異,導致我我以爲我正在使用invoke。 –

+0

BeginInvoke使用文件枚舉代碼同時調用您的lambda。一旦下一次循環迭代開始,變量文件就包含下一個文件。但是你的lambda期待舊的。一種不同的解決方案是首先將文件複製到本地變量中。 – usr

+0

使用調用,而不是BeginInvoke。 – usr

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

聽起來不錯,但file.Clone()不是一個選項。並且我將該文件變量用作FileInfo,所以我不能將它轉換爲字符串。 –

+0

.Clone()是沒有必要的,也應該沒有它 – user287107

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

爲什麼最初你使用了所有的異步操作?

+0

工作,因爲它被凍結的程序,而它搜索。這需要10秒左右。 –

+0

那麼?只需將所有內容全部封裝在一個新線程中即可。 –

相關問題