Здравствуйте!
Я имею для хранения тегов на сайте примерно такую систему:
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 на этот раз оказались только старые теги и оно опять падает.
Собственно вопрос: что за чудеса не виражах такие?