Насколько я понимаю, этот кэш был для каждого приложения, а не для сеанса, поэтому я ожидал, что он все еще будет там для меня или другого пользователя.
Пока кэш для каждого приложенияASP.NET не дает вам никаких гарантий, что если вы сохраните что-то в кеше, то найдете его там.Кеш может быть удален при различных обстоятельствах, таких как, например, у вашего сервера заканчивается память и так далее.Вы можете подписаться на событие и получать уведомления, когда элемент выгружается из кэша.Вы также можете определить приоритет при кэшировании элемента.Чем выше приоритет, тем ниже вероятность выселения этого предмета.
Кроме того, поскольку кеш хранится в памяти веб-сервера (по умолчанию), вы не должны забывать тот факт, что домен приложения может быть переработан в любой момент IIS.Например, после определенного периода бездействия, или если он начинает исчерпывать память, или даже если достигнут определенный порог использования ЦП, ... и все, что хранится в памяти, включая кеш, просто исчезнет в пустоте и следующем запросев вашем приложении запустится новый домен приложений.
Но в любом случае убедитесь, что вы проверяете, присутствует ли элемент в кеше, прежде чем его использовать.Никогда не полагайтесь на тот факт, что если вы что-то сохранили в нем, вы найдете это.
Все это блабла, чтобы прийти к действительно важному моменту, который очень беспокоит ваш код.Похоже, вы храните экземпляр List<string>
в кэше.Но поскольку кэш-память для каждого приложения, этот единственный экземпляр List<string>
может быть разделен между несколькими пользователями приложения, и, конечно, это может происходить одновременно.И, как вы знаете, List<T>
не является потокобезопасной структурой.Таким образом, с этим кодом вы в лучшем случае получите исключение, а в худшем - поврежденные данные.Поэтому будьте очень осторожны с тем, что вы кэшируете и как синхронизируете доступ к структуре, особенно если вы кэшируете не поточно-безопасный класс.