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

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

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

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 ответа

Решение

Я думаю, что проблема в том, что вам нужно в вашей лямбде элемент из цикла 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);
                }
            };                               
        }
    }
}

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

Это потому, что вы используете одну и ту же переменную 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);
                }
            };                               
        }
    }
}

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

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

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);
                            }
                        };                               
                    }
                }
            }
Другие вопросы по тегам