Cache 没有关于它所包含项的内容的信息。它只保留对这些对象的引用。

解决方案 »

  1.   

    msdn上原话:其生存期依赖于该应用程序的生存期。重新启动应用程序后,将重新创建 Cache 对象。Cache 类为您提供了一个简单的接口来自定义缓存设置,它还提供了强大的功能允许您自定义如何缓存项以及将它们缓存多长时间。例如当缺乏系统内存时,缓存自动移除很少使用的或不重要的项以允许使用内存来处理大量的请求。这种技术叫做清理。这是缓存确保非当前数据不使用宝贵的服务器资源的一种方式我回去再帮你查查
      

  2.   

    当内存紧张时,系统会自动施放Cache中最长时间没有被使用的数据。
      

  3.   

    按理说又不是声明了一个对象没有后工清理,这可是我让计算机给我存的啊.他哪能不说一声说清就给我清了呢?而且还这么快?//////////////////它是由.NET自动控制的,你可以试试使用静态变量来代替Cache
      

  4.   

    Cache看起来是有点不可靠呀你是把Cache.add放到!ispostback中吗?用Cache.Insert试过吗?能不能多贴些代码来看看。。
      

  5.   

    TO: gOODiDEA(无语) 
        如何使用静态变量? 使用静态变量的话每次往返都要重新建立吗?TO: yunhi() 
       cache不是你那样用的。
      /////////////////////
       应该如何用?所有:
       如果放在有2G内存的服务器中是不是就不会那么容易被清理掉了?
      

  6.   

    public static object abc = '你要存入的';
    这是.net的垃圾自动回收造成的,你可以试着少存些记录
      

  7.   

    作为一个.NET程序员,应该知道托管代码的内存管理是自动的。.NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保证一切那么现在就来给楼主上一课:.NET又是如何管理并释放托管资源的?在原始程序中堆的内存分配是这样的:找到第一个有足够空间的内存地址(没被占用的),然后将该内存分配。当程序不再需要此内存中的信息时程序员需要手动将此内存释放。堆的内存是公用的,也就是说所有进程都有可能覆盖另一进程的内存内容,这就是为什么很多设计不当的程序甚至会让操作系统本身都死掉。如果程序中的内存不被程序员手动释放的话那么这个内存就不会被重新分配,直到电脑重起为止,也就是我们所说的内存泄漏。所说的这些是在非托管代码中,CLR通过AppDomain实现代码间的隔离避免了这些内存管理问题,也就是说一个AppDomain在一般情况下不能读/写另一AppDomain的内存。托管内存释放就由GC(Garbage Collector)来负责。托管代码中内存的分配,托管堆中内存的分配是顺序的,也就是说一个挨着一个的分配。这样内存分配的速度就要比原始程序高,但是高出的速度会被GC找回去。GC为了提高回收的效率使用了Generation的概念,原理是这样的,第一次回收之前创建的对象属于Generation 0,之后,每次回收时这个Generation的号码就会向后挪一,也就是说,第二次回收时原来的Generation 0变成了Generation 1,而在第一次回收后和第二次回收前创建的对象将属于Generation 0。GC会先试着在属于Generation 0的对象中回收,因为这些是最新的,所以最有可能会被回收,比如一些函数中的局部变量在退出函数时就没有引用了(可被回收)。如果在Generation 0中回收了足够的内存,那么GC就不会再接着回收了,如果回收的还不够,那么GC就试着在Generation 1中回收,如果还不够就在Generation 2中回收,以此类推
      

  8.   

    使用static时得注意,用static定义的变量值,不同浏览器访问到它的值是相同的。
    Cache也一样。
    只有给不同的客户端使用相同的数据时才用static或Cache,否则可以用ViewState或Session代替。在实际写程序中,我经常用一个属性器把数据封装起来,像这样:protected DataSet SaleData
    {
    get
    {
    if(Session["SaleData"] != null)
    {
    return (DataSet)Session["SaleData"];
    }
    else
    {
    Session["SaleData"] = findData();
    return (DataSet)Session["SaleData"];
    }
    }
    set
    {
    Session["SaleData"] = value;
    }
    }在事件中可以用 this.SaleData来访问所要的数据,这样比较灵活。因为如果以后需求变了,可以只改变SaleData中封装的内容。用Session缓存数据集可以使DataGrid分页速度很快,但我不知道用Session缓存将要给不同浏览器使用的数据是不是最合理的,还请大家指点 :)