Располагает ли System.Web.Caching.Cache объекты, очищенные от кэша? - PullRequest
7 голосов
/ 24 февраля 2012

Справочная информация. Я пишу веб-приложение ASP.NET MVC 3.У меня есть List<MyObject> (на самом деле несколько списков) объектов, которые я хочу сохранить в кэше из-за удобной функции автоматического истечения срока действия и безопасности потоков.

Каждый из этих объектов внутри содержит экземпляр System.Threading.Semaphore, используемый дляРеализация принудительной установки сервера.

Поэтому мне интересно, как изменится жизненный цикл моих объектов, если я помещу их в кэш?Может ли это создать проблемы с многопоточностью / NullReferenceExceptions, если кеш фактически удаляет объекты, которые он удаляет / и т.д.?Может быть, есть еще какие-то очевидные причины не делать этого?

TIA.

1 Ответ

9 голосов
/ 24 февраля 2012

Кэш явно не располагает объектами, когда они по какой-либо причине извлекаются из кэша.Вы можете доказать это, протестировав его, но если бы это было так, то это было бы в документации, а это не так:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

Жизненный цикл объектов в кэшеможет быть расширен за счет нахождения в кэше, так как в кэше содержится ссылка на них.Если вы хотите избежать этого, вы можете вместо этого кэшировать слабую ссылку.

http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

Если вы сделаете это, не будет никаких последствий жизненного цикла сохранения ссылки в кэше.

Одна вещь, о которой стоит подумать - вы говорите, что хотите использовать кеш, потому что он потокобезопасен.Вы должны знать, что сам объект кеша является поточно-ориентированным, но если вы кешируете в кеше не поточно-безопасный объект, который не сделает сам кешируемый объект автоматически поточно-ориентированным.В частности, List<T> не является потокобезопасным, и сохранение его в кэше не изменит этого.Используйте одновременные коллекции, если хотите обеспечить безопасность потоков.

...