Похоже на проблему синхронизации. Простым решением было бы иметь объект общей блокировки (в вашем классе):
private static object _lock = new object();
Тогда ваш код становится:
string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString();
lock (_lock) {
if (!HttpContext.Current.Items.Contains(ocKey))
{
HttpContext.Current.Items.Add(ocKey, new ElevationEntityModel(EFConnectionString));
}
_eem = HttpContext.Current.Items[ocKey] as ElevationEntityModel;
}
Блок блокировки в основном означает, что как только поток входит в блок «блокировки», никакие другие потоки не могут получить доступ к этому блоку, пока не завершится первый поток. Это остановит конфликт между методом «Contains» и методом «Add».
Примечание:
Если где-либо еще в вашем приложении есть доступ к коллекции Items в HttpContext.Current, вам также необходимо выполнить синхронизацию. Целесообразно создать собственную коллекцию, добавить ее в коллекцию Items и синхронизировать доступ к ней.