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





Вы смотрели Блок приложения Enterprise Library Caching? Он позволяет сделать кеш недействительным для ряда различных событий, включая изменения файлов (AFAIK), и не требует ASP.NET (и, тем не менее, хорошо с ним интегрируется).
FWIW, когда вы вызываете зависимость EntLib, вы привязаны к этой версии. Команда EntLib не останавливается долго на версии и любит вносить критические изменения с каждой новой версией. Что нужно иметь в виду с архитектурной точки зрения!
Вы можете сохранить последнюю дату, которую вы загрузили из файла, как другой файл в том же каталоге или как статическое время даты в вашем классе. Я думаю, что последнее решение, вероятно, не то, что вы ищете, поскольку вы не можете рассчитывать на загрузку вашего класса. Я бы также подумал о том, чтобы сохранить и сравнить хэш файла 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;
}
Я ценю совет - не думаю, что знал об этой части Enterprise Library.