Как лучше всего кэшировать данные в dll C#?

Я написал библиотеку DLL, которую можно использовать разными способами (на нее ссылаются веб-сайты ASP.NET, WinForms и т. д.). Ему необходимо загрузить свои данные из нескольких файлов с разделителями, которые будут автоматически обновляться на полурегулярной основе. По соображениям производительности я загружаю данные в статический объект (общий список) и хочу вернуться к файлам только при изменении данных. (Объем данных не занимает чрезмерно много памяти, но чтение из файла занимает слишком много времени при каждом доступе). Я пробовал использовать FileSystemWatcher, но это оказалось ненадежным - он периодически пропускает обновления файлов. Поскольку я не могу рассчитывать на DLL, работающую внутри веб-сайта, параметр ASP.NET CacheDependency мне не подходит. Кто-нибудь нашел хорошее решение для такого рода вещей?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
8 752
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы смотрели Блок приложения Enterprise Library Caching? Он позволяет сделать кеш недействительным для ряда различных событий, включая изменения файлов (AFAIK), и не требует ASP.NET (и, тем не менее, хорошо с ним интегрируется).

Я ценю совет - не думаю, что знал об этой части Enterprise Library.

Jeremy Gruenwald 21.01.2009 16:52

FWIW, когда вы вызываете зависимость EntLib, вы привязаны к этой версии. Команда EntLib не останавливается долго на версии и любит вносить критические изменения с каждой новой версией. Что нужно иметь в виду с архитектурной точки зрения!

Rex M 28.01.2009 07:40

Вы можете сохранить последнюю дату, которую вы загрузили из файла, как другой файл в том же каталоге или как статическое время даты в вашем классе. Я думаю, что последнее решение, вероятно, не то, что вы ищете, поскольку вы не можете рассчитывать на загрузку вашего класса. Я бы также подумал о том, чтобы сохранить и сравнить хэш файла MD5, чтобы увидеть, когда он изменится.

Мое решение этой проблемы заключалось в периодической перезагрузке файла данных: например, раз в час. Это зависит от того, насколько важно, чтобы ваша программа имела точные данные с точностью до минуты.

Возможно, нужен гибридный подход. Используйте FileSystemWatcher, но также сохраните дату / время последнего файла (как предложено выше) и периодически проверяйте текущую дату / время в файле. Если они отличаются, перезагрузите файл. Это было бы моим предпочтительным решением, если бы было важно поддерживать данные в актуальном состоянии.

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

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

Дополнительная ссылка: http://aspalliance.com/1705_A_New_Approach_to_HttpRuntimeCache_Management.all

Если вы хотите использовать логику кеширования ASP.NET в своей DLL, просто оберните ее и укажите на нее так:

using System.Web.Caching;
...
var cache = HttpRuntime.Cache;
cache.Insert("foo", foo);

Этот код вместе с любой FileSystemDependency, которую вы хотите добавить к нему, будет одинаково хорошо работать в вашей библиотеке, независимо от того, работает ли он в Интернете, winform, консоли или контексте службы.

Вы также можете сделать это, если хотите использовать тот же кеш, что и Интернет, но это необязательно:

HttpContext context = HttpContext.Current;
            if (context != null)
            {
                _cache = context.Cache;
            }
            else
            {
                _cache = HttpRuntime.Cache;
            }

Другие вопросы по теме