7

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

4

4 回答 4

14

ASP.NET 缓存和关联的 CacheDependency 不依赖于 ASP.NET、IIS 或 Web 服务器。您可以自由地将它用于这种确切的情况。与企业库缓存应用程序块相比,它需要的工作量要少得多,并且使用和记录得更广泛。

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

如果要在 DLL 中使用 ASP.NET 缓存逻辑,只需将其包装并引用它,如下所示:

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

此代码以及您希望添加到其中的任何 FileSystemDependency 将在您的库中同样有效,无论它是否在 Web、winform、控制台或服务上下文中运行。

如果您想确保使用与 Web 相同的缓存,您也可以这样做,但它是可选的:

HttpContext context = HttpContext.Current;
            if(context != null)
            {
                _cache = context.Cache;
            }
            else
            {
                _cache = HttpRuntime.Cache;
            }
于 2009-01-28T04:37:52.697 回答
6

您是否查看过Enterprise Library Caching 应用程序块?它允许对许多不同的事件进行缓存失效,包括文件更改 (AFAIK),并且不需要 ASP.NET(然而,与它很好地集成)。

于 2009-01-20T22:03:51.257 回答
2

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

于 2009-01-20T22:05:27.040 回答
1

我对这个问题的解决方案是定期重新加载数据文件:例如每小时一次。这取决于您的程序拥有准确的最新数据的重要性。

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

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

于 2009-01-20T23:16:07.117 回答