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

問題は、1つtextBox1.textしかないことがわかっているものに設定すると、Files4回に追加されることです。表示方法に問題がないことを確認するために、ブレークポイントを試してみました。

4つのオブジェクトを互いに比較しました。それらは同一です。検索条件を少し開いて5つの結果を得ると、そのうちのいくつかは1であり、いくつかは2倍であり、いくつかは3倍です。したがって、5つの固有の結果がありますが、合計で約10〜12になります。

私は何が間違っているのですか?

4

3 に答える 3

1

呼び出しを使用します。

ラムダは、変更されている変数ファイルをキャプチャしています。重複するだけでなく、ファイルも不足しています。

于 2012-05-15T18:26:29.143 に答える
0

列挙変数を直接使用しています

変数をローカル変数にコピーする場合は、問題ないはずです

Files.Clear(); //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 に答える