Можете ли вы создать несколько наблюдателей в консольном приложении, используя анонимного делегата? - PullRequest
0 голосов
/ 17 января 2011

В другом Вопросе Я спросил, я получил совет по использованию анонимного делегата. Функциональность работает для одного наблюдателя, но когда я создаю три, он сохраняет только последний. Это из-за анонимного делегата и есть ли решение для этого?

Я добавил код.

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

Ответы [ 3 ]

1 голос
/ 17 января 2011

Я думаю, что проблема в том, что вам нужно в вашей лямбде элемент из цикла foreach.Создайте его локальную копию в цикле, и все должно работать нормально:

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

Чтобы лучше объяснить, что происходит, взгляните на этот блог от Эрика .

1 голос
/ 17 января 2011

Это потому, что вы используете одну и ту же переменную watcher. Попробуйте воссоздать нового наблюдателя на каждой итерации:

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 голосов
/ 17 января 2011

Теперь вы перезаписываете свой предыдущий наблюдатель ... поэтому работает только последний определенный наблюдатель.

не знаю, работает ли это:

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