使用HttpContext.Current缓存对象在使用异步应注意

  昨天在站点生成站点页面的一个静态模块的时候,使用到了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);



       这样相当于是在程序开始的时候就已经创建了缓存,后面只是对其缓存做的一个

修改。就这样,问题得以解决..呵呵

转载于:https://www.cnblogs.com/items116/archive/2011/10/28/2227850.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值