我编写了一个可以多种方式使用的DLL(由ASP.NET网站,WinForms等引用)。它需要从几个定界文件加载其数据,这些文件将在半定期的基础上自动更新。出于性能原因,我将数据加载到静态对象(通用列表)中,并且只想在数据更改时返回到文件。 (数据量不占用不合理的内存量,但每次访问时从文件中读取确实需要很长时间)。我尝试过使用FileSystemWatcher,但事实证明它不可靠 - 它会定期错过文件更新。由于我不能指望在网站内运行的DLL,因此ASP.NET CacheDependency选项似乎不合适。有没有人找到这种方法的好方法?
答案 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,还可以保存上一个文件的日期/时间(如上所述),并定期检查文件的当前日期/时间。如果它们不同,则重新加载文件。如果保持数据最新非常重要,那将是我的首选解决方案。
您还可以构建一种在需要重新加载数据时通知程序的方法。