Каков наилучший способ кэширования данных в C # DLL? - PullRequest
7 голосов
/ 21 января 2009

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

Ответы [ 4 ]

14 голосов
/ 28 января 2009

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

Некоторые дополнительные ссылки: http://aspalliance.com/1705_A_New_Approach_to_HttpRuntimeCache_Management.all

Если вы хотите использовать логику ASP.NET Cache в вашей 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;
            }
6 голосов
/ 21 января 2009

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

2 голосов
/ 21 января 2009

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

1 голос
/ 21 января 2009

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

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

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

...