2017-10-31 13 views
0

디렉토리에있는 내 파일 목록을 가져 와서 콘솔에 이름을 인쇄하는 동안 디렉토리에 새 파일을 추가합니다 (디렉토리는 FileSystemWatcher으로 모니터링 됨). 그것의 이름, 그러나 그것은 예외를 던졌습니다 : 컬렉션이 수정되었습니다; 열거 연산이 실행되지 않을 수 있습니다.. iterating 중에 Watcher를 사용하여 실시간으로 목록에 항목 추가

코드입니다 :

private static void Main(string[] args) 
    { 
     var myfiles = new List<string>(); 
     myfiles = Directory.GetFiles(@"c:\items").ToList(); 

     foreach (var file in myfiles) 
     { 
      Console.WriteLine(file); 
     } 
    } 

    public static void Run(List<string> myfiles) 
    { 
     var watcher = new FileSystemWatcher { Path = @"c:\items" }; 
     watcher.Created += (source, e) => 
     { 
      myfiles.Add(e.FullPath); 
     }; 
     watcher.EnableRaisingEvents = true; 
    } 

Q : 어떻게 내가 목록을 반복하고있는 동안 감시자를 사용하여 목록에 항목을 추가 할 수 있습니까? iterating하는 동안 RealTime에서 목록에 항목을 추가하는 다른 방법이 있습니까?

참고 : 디버깅에서 감시자가 목록에 항목을 올바르게 추가하는 것을 보았습니다.하지만 항목을 추가 한 후에는 예외가 발생합니다.

참고 : 또한 두 번째 스레드를 만들어 Watcher를 넣었습니다.

답변

0

여기서 중요한 문제는 'foreach (myfile의 var 파일)'에서 목록을 반복하는 동안 (별개의 스레드 임에도 불구하고) 목록에 myFiles을 추가한다는 것입니다. 목록을 반복하는 동안 항목을 목록에 추가 할 수 없습니다.

내장형 BlockingCollection을 살펴보면 이러한 종류의 시나리오에 이상적인 Producer/Consumer 패턴을 구현할 수 있습니다. 당신이 최종 결과를 원하는 무엇

class Program 
    { 
     private static string _directoryName = @"c:\items"; 

     private static readonly BlockingCollection<string> FilesList = new BlockingCollection<string>(); 

     static void Main(string[] args) 
     { 
      Run(); 

      var myfiles = Directory.GetFiles(_directoryName).ToList(); 

      foreach (var file in myfiles) 
      { 
       FilesList.Add(file); 
      } 

      foreach (var item in FilesList.GetConsumingEnumerable()) 
      { 
       Console.WriteLine(item); 
      } 

      Console.ReadLine(); 
     } 

     public static void Run() 
     { 
      var watcher = new FileSystemWatcher { Path = _directoryName }; 
      watcher.Created += (source, e) => 
      { 
       FilesList.Add(e.FullPath); 
      }; 
      watcher.EnableRaisingEvents = true; 
     } 
    } 
+0

이 될 : 여기

은 작업 예입니다? 나는 당신이 (1) 콘솔 응용 프로그램이 시작할 때 폴더에있는 모든 파일을 나열하려고한다고 가정합니다. (2) 콘솔에 새 파일이 표시되면 폴더에 추가됩니까? –

+0

그게 무슨 오류가 아니에요. 동일한 스레드에서 루프 내부에서 목록을 수정하려고하면 * 동일한 * 오류가 발생합니다. 실제로 FSW는 별도의 스레드를 사용하지 않습니다. –

+0

동의 함, 어떤 스레드가 목록에 추가하려고하든 문제가되지 않습니다. 요점은 목록을 반복하면서 목록에 추가 할 수 없다는 것입니다. –