Использование ASP.NET потокобезопасного объекта кэша с почти доступным только для чтения объектом - PullRequest
1 голос
/ 01 февраля 2012

Я использовал объект кэша для хранения объекта XMLDocument.Чтобы быть точным, код выглядит так:

XmlDocument xDoc = new XmlDocument();
if (HttpRuntime.Cache.Get("AuthorizationXML") == null)
{
    string file = GetAuthorizationXmlFilePath();
    xDoc.Load(file);
    HttpRuntime.Cache.Insert("AuthorizationXML", xDoc, new CacheDependency(file));
}
else
{
    xDoc = (XmlDocument)HttpRuntime.Cache.Get("AuthorizationXML");
}

return xDoc;

В любом случае, мой руководитель группы предположил, что, поскольку объект кэша является потокобезопасным, будет бесполезно использовать его для объекта почти только для чтения, и его будет лучше реализоватьобъект кеша как одноэлементный объект без резьбы на объекте приложения.Это утверждение звучит правдоподобно?Означает ли потокобезопасность, что объект кэша реализован с блокировкой, это замедлит работу системы?Применяется ли блокировка даже при чтении из кэша?Буду признателен за любой комментарий.

1 Ответ

1 голос
/ 01 февраля 2012

ASP.NET гарантирует безопасность потоков только при изменении элемента в кэше, но не дает никаких гарантий при изменении объекта, который он содержит в кэше.Поэтому, если объект, который вы извлекаете из кэша, не является неизменным (= невозможно изменить после создания), кэш ASP.NET будет не защищать вас.

Объекты, которые не неизменный, должен не быть повторно использован несколькими потоками.Не имеет значения, храните ли вы его в кэше ASP.NET или какой-либо глобальной переменной.Повторное использование изменяемых объектов над потоками опасно и может привести к условиям гонки, если они (случайно) изменены.

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

Кэш ASP.NET позволяет хранить элемент в кэше в течение некоторого времени, в то время как синглтон будет (по определению) оставаться там до тех пор, пока не исчезнет домен приложения.Поэтому, если вам нужно, чтобы элемент обновлялся более одного раза за время существования AppDomain (что вы показываете в своем примере с использованием CacheDependency), тогда вам нужно нечто иное, чем Singleton;такой как кеш ASP.NET.

...