2011-01-17 4 views
0

In einem anderen Question Ich fragte, ich bekam einen Tipp auf die Verwendung eines anonymen Delegierten. Die Funktionalität funktioniert für einen einzelnen Beobachter, aber wenn ich drei erzeuge, behält es nur den letzten. Liegt das an dem anonymen Delegierten und gibt es dafür eine Lösung?Können Sie mehrere Beobachter in einer Konsolenanwendung mit einem anonymen Delegaten erstellen?

Ich habe den Code hinzugefügt.

foreach (ConfigurationSectionGroup sectionGroup in sectionGroups) 
{ 
    if (sectionGroup.Name == "FileCheckerConfigGroup") 
    { 
     foreach(ConfigurationSection configurationSection in sectionGroup.Sections) 
     { 
      //FileChecker filecheck = new FileChecker(); 
      //filecheck.ProccessFolders(configurationSection); 
      //FileChecker filecheck = new FileChecker(); 
      var section = ConfigurationManager.GetSection(configurationSection.SectionInformation.SectionName) as NameValueCollection; 
      watcher = new FileSystemWatcher(section["inputDirectory"]); 
      watcher.EnableRaisingEvents = true; 
      watcher.Created += (sender, e) => 
      { 
       using (var filecheck = new FileChecker()) 
       { 
        filecheck.ProccessFolders(configurationSection); 
       } 
      };        
     } 
    } 
} 

Antwort

1

Ich denke, das Problem ist, dass Sie in Ihrem Lambda das Element aus der foreach-Schleife benötigen. Erstellen Sie eine lokale Kopie davon in der Schleife und alles sollte gut funktionieren:

foreach (ConfigurationSectionGroup sectionGroup in sectionGroups) 
{ 
    if (sectionGroup.Name == "FileCheckerConfigGroup") 
    { 
     foreach(ConfigurationSection configurationSection in sectionGroup.Sections) 
     { 
      //FileChecker filecheck = new FileChecker(); 
      //filecheck.ProccessFolders(configurationSection); 
      //FileChecker filecheck = new FileChecker(); 
      var localConfigurationSectionCopy = configurationSection; 
      var section = ConfigurationManager.GetSection(configurationSection.SectionInformation.SectionName) as NameValueCollection; 
      watcher = new FileSystemWatcher(section["inputDirectory"]); 
      watcher.EnableRaisingEvents = true; 
      watcher.Created += (sender, e) => 
      { 
       using (var filecheck = new FileChecker()) 
       { 
        filecheck.ProccessFolders(localConfigurationSectionCopy); 
       } 
      };        
     } 
    } 
} 

Für eine bessere Erklärung, was falsch einen Blick auf this blog from Eric nehmen würde.

+0

Dies ist ein interesting Blog. Danke, dass du mir das gezeigt hast. – Andy

1

Das ist, weil Sie die gleiche Variable watcher verwenden. Versuchen Sie einen neuen Beobachter bei jeder Iteration neu zu erstellen:

foreach (ConfigurationSectionGroup sectionGroup in sectionGroups) 
{ 
    if (sectionGroup.Name == "FileCheckerConfigGroup") 
    { 
     foreach (ConfigurationSection configurationSection in sectionGroup.Sections) 
     { 
      var section = ConfigurationManager.GetSection(configurationSection.SectionInformation.SectionName) as NameValueCollection; 
      var watcher = new FileSystemWatcher(section["inputDirectory"]); 
      watcher.EnableRaisingEvents = true; 
      watcher.Created += (sender, e) => 
      { 
       using (var filecheck = new FileChecker()) 
       { 
        filecheck.ProccessFolders(configurationSection); 
       } 
      };        
     } 
    } 
} 
0

Was Sie tun, ist jetzt Ihre früheren Beobachter überschreiben .. das ist der Grund, nur die letzte definierte Beobachter funktioniert ..

weiß nicht, ob dies funktioniert:

watcher = new FileSystemWatcher(section["inputDirectory"]); 
foreach (ConfigurationSectionGroup sectionGroup in sectionGroups) 
      { 
       if (sectionGroup.Name == "FileCheckerConfigGroup") 
       { 
        foreach (ConfigurationSection configurationSection in sectionGroup.Sections) 
        { 
         //FileChecker filecheck = new FileChecker(); 
         //filecheck.ProccessFolders(configurationSection); 
         //FileChecker filecheck = new FileChecker(); 
         var section = ConfigurationManager.GetSection(configurationSection.SectionInformation.SectionName) as NameValueCollection; 
         watcher.EnableRaisingEvents = true; 
         watcher.Created += (sender, e) => 
         { 
          using (var filecheck = new FileChecker()) 
          { 
           filecheck.ProccessFolders(configurationSection); 
          } 
         };        
        } 
       } 
      } 
+0

Der Abschnitt, der das zu überwachende Verzeichnis enthält, wird nur in der Schleife erstellt und ist für jeden Beobachter unterschiedlich. – Andy

+1

oops ja natürlich .. Sie müssen nur einen neuen Beobachter initialisieren, anstatt den gleichen Beobachter zu überschreiben. ändere deine Zeile "watcher = new FileSystemWatcher (Abschnitt [" inputDirectory "]);" in "FileSystemWatcher Watcher = neuer FileSystemWatcher (Abschnitt [" inputDirectory "]); " – BvdVen

Verwandte Themen