系列目录:
SqlCacheDependency使用轮流检测技术(轮询)使缓存无效
-------------------------------------------------------------------------------------------
按Msdn解释,CacheDependency在存储于 ASP.NET 应用程序的 Cache 对象中的项与文件、缓存键、文件或缓存键的数组或另一个 CacheDependency 对象之间建立依附性关系。CacheDependency 类监视依附性关系,以便在任何这些对象更改时,该缓存项都会自动移除。
CacheDependency有几中重载,各作用如下。
//假设缓存的来源文件是当前目录下的data.xml文件
//缓存依赖的文件路径
//缓存依赖的文件可以有多个
//检查缓存依赖更改的依据时间
//检查多个依赖文件更改的依据时间
//检查依赖多个文件,也依赖多个缓存键值
new string [] { " Category " , " Category1 " });
//关联依赖,还可以依赖于另一个文件缓存依赖
new string [] { " Category " , " Category1 " }, mydep);
//文件和键值上次修改的依据时间
new string [] { " Category " , " Category1 " }, DateTime.Now);
//文件、另一个缓存依赖和键值上次修改的依据时间
new string [] { " Category " , " Category1 " }, mydep,DateTime.Now);
例子
用CacheDependency监控一个XML文件。当XML文件变更时清除缓存,然后重新取得数据。方法如下。
新建一个Asp.Net应用程序。在App_Data中建立一个XML文件,名为XmlData.XML。内容如下:
< book >
< item >
< bookName > C#开发 </ bookName >
< author > 陈宽田 </ author >
</ item >
< item >
< bookName > Ado.net开发 </ bookName >
< author > 陈成城 </ author >
</ item >
</ book >
新建一个aspx文件,名子为CacheDependencyPage.aspx。在页面放一个GridView,命名为gvData用于显示XML数据。编写后台代码,如下:
using System.Web.Caching;
namespace SqlDependencyInAspNet
{
public partial class CacheDependencyPage : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
GetData();
}
}
private void GetData()
{
DataTable tableData = new DataTable();
if (Cache[ " data " ] == null )
{
DataSet ds = new DataSet();
string filePath = Server.MapPath( " ~/App_Data/XmlData.xml " );
ds.ReadXml(filePath);
tableData = ds.Tables[ 0 ];
CacheDependency cdy = new CacheDependency(filePath);
Cache.Insert( "data" , tableData, cdy);
if (cdy.HasChanged)
{
System.Diagnostics.Debug.WriteLine( " Xml已变更 " );
}
}
else
{
tableData = (DataTable)Cache[ " data " ];
}
gvData.DataSource = tableData;
gvData.DataBind();
}
}
}
测试,运行程序,页面上会显示XML中的数据,后台会缓存当前取出的数据。刷新页面时会中缓存中取数据。然后修改XML文件中的内容,再次刷新,缓存会被删除,然后重新取得XML中的内容。