2017-10-31 12 views
0

ディレクトリに自分のファイルのリストが表示され、コンソールに名前が表示されます。ディレクトリに新しいファイルを追加します(ディレクトリはFileSystemWatcherによって監視されます)。その名前ですが、例外をスローします:コレクションが変更されました。列挙操作は実行されません。反復中にウォッチャーを使用してリアルタイムでリストに追加する

この

はコードです:

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:どのように私は、リストを反復処理していながらウォッチャーを使用してリストに項目を追加することができますか?イテレーション中にRealTimeのリストに項目を追加する方法はありますか?

注:デバッガでは、ウォッチャーがアイテムを適切に追加するのを見ましたが、アイテムが追加された後、例外がスローされます。

注:2番目のスレッドも作成し、ウォッチャーをその中に入れました。

答えて

0

ここでの主な問題は、あなたのmyFilesリストに(別のスレッドでも)あなたの `foreach(myfiles内のvarファイル) 'のリストを反復しようとしていることです。リストを反復処理している間はリストに項目を追加できません。

組み込みの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

同意すると、どのスレッドがリストに追加しようとしても問題はありません。つまり、反復しながらリストに追加することはできません。 –

関連する問題