在C#dll中缓存数据的最佳方法是什么?

时间:2009-01-20 21:58:58

标签: .net file dll caching dependencies

我编写了一个可以多种方式使用的DLL(由ASP.NET网站,WinForms等引用)。它需要从几个定界文件加载其数据,这些文件将在半定期的基础上自动更新。出于性能原因,我将数据加载到静态对象(通用列表)中,并且只想在数据更改时返回到文件。 (数据量不占用不合理的内存量,但每次访问时从文件中读取确实需要很长时间)。我尝试过使用FileSystemWatcher,但事实证明它不可靠 - 它会定期错过文件更新。由于我不能指望在网站内运行的DLL,因此ASP.NET CacheDependency选项似乎不合适。有没有人找到这种方法的好方法?

4 个答案:

答案 0 :(得分:14)

ASP.NET缓存和关联的CacheDependency与ASP.NET,IIS或Web服务器无关。您可以在这种情况下自由使用它。它比企业库缓存应用程序块需要更少的工作量,并且被更广泛地使用和记录。

一些额外的参考: http://aspalliance.com/1705_A_New_Approach_to_HttpRuntimeCache_Management.all

如果要在DLL中使用ASP.NET Cache逻辑,只需将其包装并引用即可:

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

此代码以及您要添加的任何FileSystemDependency,无论是否在web,winform,控制台或服务上下文中运行,都可以在您的库中同样运行。

如果您想确保使用与网络相同的缓存,也可以执行此操作,但它是可选的:

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

答案 1 :(得分:6)

你看过Enterprise Library Caching application block了吗?它允许对许多不同的事件(包括文件更改(AFAIK))进行高速缓存失效,并且不需要ASP.NET(并且与它很好地集成)。

答案 2 :(得分:2)

您可以将从文件加载的最后日期保存为同一目录中的另一个文件,或者保存在类中的静态日期时间。我认为最后的解决方案可能不是你想要的,因为你不能指望你的课程被加载。我还会考虑保存和比较文件的MD5哈希,以查看它何时发生变化。

答案 3 :(得分:1)

我对此问题的解决方案是定期重新加载数据文件:例如,每小时一次。这取决于您的程序具有精确到分钟数据的重要程度。

也许需要一种混合方法。使用FileSystemWatcher,还可以保存上一个文件的日期/时间(如上所述),并定期检查文件的当前日期/时间。如果它们不同,则重新加载文件。如果保持数据最新非常重要,那将是我的首选解决方案。

您还可以构建一种在需要重新加载数据时通知程序的方法。