2012-05-15 3 views
1

나는이 코드를 가지고있다. (지금까지 도움이 된 덕분에)열거 파일이 같은 파일을 두 번 이상 반환하는 이유는 무엇입니까?

파일 이름을 찾는 디렉토리와 모든 하위 디렉토리를 검색한다. 나는 단지 1, 그것을 추가의 Files 4 배가 알고있는에 textBox1.text를 설정하면

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

문제입니다. 나는 그것이 그것을 어떻게 나타내고 있었는지 확신 할 수 없다는 것을 지적하면서 휴식을 시도했다.

4 개의 개체를 서로 비교 한 결과 동일합니다. 검색 기준을 조금 열고 5 가지 결과를 얻으면 그 중 일부는 1이고 일부는 3 배가됩니다. 그래서 5 개의 유일한 결과가 있지만 약 10-12의 합계가 있습니다.

내가 뭘 잘못하고 있니?

답변

1

Invoke를 사용하십시오.

귀하의 람다가 변경중인 가변 파일을 캡처하고 있습니다. 중복 파일을 가져 오는 것이 아니라 파일이 누락되었습니다. 직접 로컬 변수에 변수를 복사하는 경우)는 (

Files.Clear 잘해야

변수리스트를 사용

+0

위의 코드 대부분을 작성하지 않은 상태에서 조금 더 명확하게 표현할 수 있습니까? 그리고 그 코드를 사용하여 연주하는 동안 훨씬 더 의미가 있습니다. 파일 변수가 변형되는 위치를 표시 할 수 있습니까? 나는 invoke를 사용하고 있다고 생각했다. –

+0

BeginInvoke가 파일 열거 코드와 동시에 람다를 호출 중입니다. 다음 루프 반복이 시작되면 변수 파일에 다음 파일이 포함됩니다. 그러나 당신의 람다는 오래된 것을 기대했습니다. 다른 해결책은 먼저 로컬 변수에 파일을 복사하는 것입니다. – usr

+0

BeginInvoke가 아닌 Invoke를 사용하십시오. – usr

0

; // BindingList DataGridview 용 데이터 소스

+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

그래서? 모든 블록을 새로운 스레드로 전체 블록으로 묶으십시오. –

관련 문제