2013-05-29 2 views
1

В моем приложении я прочитал некоторые xml-файлы в списке объектов (List<Thing>), но я хочу, чтобы не удавалось попасть в файловую систему по каждому запросу. Данные в xml-файлах редко меняются, поэтому я хотел бы каким-то образом кэшировать их. Либо загрузить данные о запуске приложения, либо загрузить его ленивым, все в порядке со мной. Мне нужно будет иметь возможность использовать данные во всем моем приложении и запускать запросы Linq против него, почти используя его как мини-базу данных в памяти. Мне нужно будет иметь возможность изменять/обновлять данные, не влияя на кешированную версию, поэтому может понадобиться скопировать данные в локальную переменную. Как я могу это достичь?Кэш или переменная приложения для хранения списка объектов?

+1

Вы уже не кешируете его в 'List '? –

+0

Правильно, но я хочу, чтобы он был доступен для всех пользователей между запросами. –

ответ

2

вы можете использовать кэш-объект для него.

myxmllist = HttpContext.Current.Cache["myxmllist"]; 

    if (myxmllist == null) 
    { 
     //get xml from server 

     HttpContext.Current.Cache.Insert("myxmllist", myxmllist); // add it to cache 
    } 
+0

Безопасна ли эта структура данных (т. Е. Вам не нужно «блокировать» при ее использовании)? –

+1

@MichaelPerrenoud Доступ к самому кешу безопасен. Если вы храните объект внутри кеша, который не предназначен для использования из нескольких потоков, тогда у вас может быть проблема. В этом случае было бы важно либо использовать коллекцию из пространства имен Concurrent, либо убедиться, что вы только когда-либо читаете данные в кеше (который является потокобезопасным), а не записывайте на него. – Servy

+0

@Servy, спасибо большое! Я всегда строил свои собственные. Чтобы уточнить, когда вы говорите «или убедитесь, что вы только когда-либо читали данные из кеша», подразумевается, что вы загрузите весь фронт кэша в «Global.asax» (общий) ** или ** только * добавьте *, когда что-то не существует? –

1

Одним из основных преимуществ System.Runtime.Caching.MemoryCache или System.Web.Caching.Cache является возможность установить политику истечения по пунктам вы кэшировать. Если вы собираетесь загружать данные только один раз и хранить их в памяти в течение всего жизненного цикла процесса, вы можете также использовать статический член класса, который вы создаете и заполняете данными в статическом конструкторе того же класса. Если ваши операции изменения/обновления не влияют на данные в памяти, вам необходимо загрузить (или скопировать) данные в другой экземпляр контейнера и изменить (и, возможно, сохранить) его.