Я подозреваю, что проблема связана со старой версией ObjectBuilder, которая когда-то была частью проекта расширения WCSF и между тем перешла в Unity. Я не уверен, нахожусь ли я на правильном пути или нет, поэтому я надеюсь, что кто-то там обладает более компетентными навыками обеспечения безопасности потоков, чтобы объяснить, может ли это быть проблемой или нет.Есть ли проблема защиты потоков в этом коде ObjectBuilder?
Я использую эту (устаревшую) реализацию ObjectBuilder в веб-приложении ASP.Net WCSF и редко вижу в журналах, что ObjectBuilder жалуется, что какое-то конкретное свойство класса не может быть введено по какой-либо причине, проблема в том, что всегда, чтобы это свойство никогда не вводилось вообще. Собственность и класс постоянно меняются. Я проследил код до метода, в котором словарь используется для хранения информации о том, обрабатывается ли объект ObjectBuilder или нет.
Мой вопрос в основном сводится к следующему: существует ли проблема с потоковой безопасностью в следующем коде, который может привести к тому, что ObjectBuilder получит несовместимые данные из своего словаря?
Класс, который содержит этот код (ReflectionStrategy.cs), создается как Singleton, поэтому все запросы к моему веб-приложению используют этот класс для создания его объектов вида/страницы. Его словарь является частным поле, используется только в этом методе и заявил так:
private Dictionary<int, bool> _memberRequiresProcessingCache = new Dictionary<int, bool>();
private bool InnerMemberRequiresProcessing(IReflectionMemberInfo<TMemberInfo> member)
{
bool requires;
lock (_readLockerMrp)
{
if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo.GetHashCode(), out requires))
{
lock (_writeLockerMrp)
{
if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo.GetHashCode(), out requires))
{
requires = MemberRequiresProcessing(member);
_memberRequiresProcessingCache.Add(member.MemberInfo.GetHashCode(), requires);
}
}
}
}
return requires;
}
Этот код выше не последняя версия, которую вы можете найти на Codeplex, но я все еще хочу знать, может ли это быть причиной мои исключения ObjectBuilder. Пока мы говорим, я работаю над обновлением, чтобы заменить этот старый код на последнюю версию. Это последняя реализация, к сожалению, я не могу найти никакой информации, почему она была изменена. Может быть, ошибка, может быть для исполнения ...
private bool InnerMemberRequiresProcessing(IReflectionMemberInfo<TMemberInfo> member)
{
bool requires;
if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo, out requires))
{
lock (_writeLockerMrp)
{
if (!_memberRequiresProcessingCache.TryGetValue(member.MemberInfo, out requires))
{
Dictionary<TMemberInfo, bool> tempMemberRequiresProcessingCache =
new Dictionary<TMemberInfo, bool>(_memberRequiresProcessingCache);
requires = MemberRequiresProcessing(member);
tempMemberRequiresProcessingCache.Add(member.MemberInfo, requires);
_memberRequiresProcessingCache = tempMemberRequiresProcessingCache;
}
}
}
return requires;
}
Также полезно было бы предложить как настроить тест, который может ответить на вопрос, подвержен ли этот код многопоточным ошибкам. – Eulinky