昨天在站点生成站点页面的一个静态模块的时候,使用到了appliction 和一步处理缓存,需求是判断缓存中是否有该字段,如果有则取字段,没有则从模版中直接取,同时异步调用方法生从数据库中取相关信息生成HTML存入缓存中。具体的如下:
public delegate void TypeWeiTuo ();
///<summary>
/// 读取模块数据
///</summary>
///<returns></returns>
public static string ModelValue()
{
string pageContent = "";
//缓存中的枚举库信息
IDictionaryEnumerator idict = HttpContext.Current.Cache.GetEnumerator();
while (idict.MoveNext())
{
//查询遍历缓存值是否存在
if (idict.Key.ToString().Equals("cachekey"))
{
//存在则对变量赋值
pageContent = idict.Value.ToString(); //赋值缓存
break;
}
}
if (pageContent=="")
{
//不存在再从资源包中读取数据
pageContent = HttpContext.GetGlobalResourceObject("page", "pagevalue").ToString();
//异步赋值缓存
StateHtml sh = new StateHtml();
TypeWeiTuo aqtwt = new TypeWeiTuo(sh.GetType);
//执行异步
aqtwt.BeginInvoke(null, null);
}
return pageContent;
}
转到GetType()方法,代码如下:
public void GetType()
{
//...模块数据
//对缓存赋值
HttpContext.Current.Cache.Insert("cachekey", 缓存值[模块数据]);
}
在这里有必要说明下 Cache.Insert和Cache.Add 最开始的时候使用的Add,但是发现缓存值并没有改变,结果一查API发现 Add是查找缓存中的Key是否存在,存在则添加失败,也就是说该缓存的值并没有发生改变,如果说是Insert 则是不管缓存是否存在都将从写,所以说如果你想改变缓存则需要使用Insert方法。
最后调试的时候发现程序一直报 Cache 未实例化,当时就很纳闷,Cache不是直接就拿来使用吗?为什么还会出现这样的错误?后来仔细分析了下,原来在调用异步处理的时候在 GetType方法中根本就不是一个对象,最后做了进一步的修改,利用Appliction 在程序开始,修改代码如下:
//声明委托
public delegate void AppTypeWeiTuo(HttpContext ucx);
protected void Application_Start(object sender, EventArgs e)
{
//实例化存入缓存的方法
WeiTuoClass wtc = new WeiTuoClass();
//调用
AppTypeWeiTuo twt= new AppTypeWeiTuo(wtc.GetType);
aqtwt.BeginInvoke(HttpContext.Current,null, null);
}
然后把 ModelValue()方法和 GetType() 传入对应的 HttpContext.Current。即
public delegate void TypeWeiTuo (HttpContext.Current);
这样相当于是在程序开始的时候就已经创建了缓存,后面只是对其缓存做的一个
修改。就这样,问题得以解决..呵呵