ConcurrentDictionary и потерянные данные
От: 80LevelElf http://80levelelf.com
Дата: 14.02.15 22:16
Оценка: :)
Здравствуйте!
Я имею для хранения тегов на сайте примерно такую систему:
1) Общий статический класс для доступа к репозиториям. Он соответственно общий для всех юзеров и всех потоков.
    public static class RepositoryManager
    {
        public static TagRepository TagRepository { get; private set; }

        static RepositoryManager()
        {
            TagRepository = new TagRepository();
        }
    }

2) Сам класс репозитория имеет дублирующую функциональность: работает из бд и с кешем. При инициализации загружает данные из бд в кеш. Судя по отладчику все загружается и сохраняется.
    public sealed class TagRepository : BigSqlRepository<TagData>
    {
        private TagCacheCollection CacheCollection { get; set; }

        public TagRepository()
        {
            CacheCollection = new TagCacheCollection(GetList());
        }

        public override TagData GetById(Int64 id)
        {
            return CacheCollection.GetTag(id);
        }
    }

3) Собственно сам класс кеширования
    public class TagCacheCollection
    {
        private ConcurrentDictionary<Int64, TagData> DataDictById { get; set; } 

        public TagCacheCollection(IEnumerable<TagData> initialCollection)
        {
            DataDictById = new ConcurrentDictionary<Int64, TagData>(initialCollection.Select(i =>
                new KeyValuePair<Int64, TagData>(i.Id, i))); /////Вот тут все работает и загружается
        }

        public TagData GetTag(Int64 id)
        {
            return DataDictById[id]; ////Вот тут падает
        }
    }

И собственно возникает такая проблема:
1) Сначала было так:
Несмотря на то, что данные загружаются в DataDictById нормально, при вызове GetTag в DataDictById этих данные не оказывается. То есть DataDictById остается вообще пустой.
Хотя и инициализируется и дергается DataDictById в одном и том же запросе, то есть на теоретические проблемы многопоточности из-за использования статического класса тут скинуть не удастся.
2) Потом неожиданно, после прохождения всего пути отладчиком, все теги закинулись и все стало работать хорошо и правильно. Я пробовал перезагружать студию, перекомпилировать — все работало. Я добавил новые теги. Из бд они опять же брались, отладчик показывал, что взялись все теги, но в GetTag на этот раз оказались только старые теги и оно опять падает.
Собственно вопрос: что за чудеса не виражах такие?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.