除了System.Web.Caching下的Cache外,我们还可以用到HttpContext.Current.Cache以及HttpRuntime.Cache
那么,HttpContext.Current.Cache以及HttpRuntime.Cache有什么区别呢?
从MSDN上的解释可以看出,HttpRuntime.Cache是应用程序级别的,而HttpContext.Current.Cache是针对当前WEB上下文定义的。
然而,实际上,这二个都是调用的同一个对象,不同的是:HttpRuntime下的除了WEB中可以使用外,非WEB程序也可以使用。
而HttpContext则只能用在WEB中。
因此,在可能的情况下,我们尽可能使用HttpRuntime(然而,在不同应用程序之间如何调用也是一个问题)。
=====
以下是摘录自:http://www.cnblogs.com/caoxch/archive/2006/11/20/566236.html
的对Cache的详细介绍
通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。同样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。
在这些情况下,为了帮助您提高应用程序的性能,ASP.NET 使用两种基本的缓存机制来提供缓存功能。第一种机制是应用程序缓存,它允许您缓存所生成的数据,如
DataSet
或自定义报表业务对象。第二种机制是页输出缓存,它保存页处理输出,并在用户再次请求该页时,重用所保存的输出,而不是再次处理该页。
应用程序缓存
应用程序缓存提供了一种编程方式,可通过键/值对将任意数据存储在内存中。使用应用程序缓存与使用应用程序状态类似。但是,与应用程序状态不同的是,应用程序缓存中的数据是易失的,即数据并不是在整个应用程序生命周期中都存储在内存中。使用应用程序缓存的优点是由
ASP.NET 管理缓存,它会在项过期、无效、或内存不足时移除缓存中的项。还可以配置应用程序缓存,以便在移除项时通知应用程序。有关更多信息,请参见缓存应用程序数据。
使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。
有关更多信息,请参见如何:检索缓存项的值。
页输出缓存
页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制允许 ASP.NET
向客户端发送页响应,而不必再次经过页处理生命周期。页输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,页输出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在
Web.config 文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。
页输出缓存提供了两种页缓存模型:整页缓存和部分页缓存。整页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓存允许缓存页的部分内容,其他部分则为动态内容。有关更多信息,请参见缓存 ASP.NET
页。
部分页缓存可采用两种工作方式:控件缓存和缓存后替换。控件缓存有时也称为分段缓存,这种方式允许将信息包含在一个用户控件内,然后将该用户控件标记为可缓存的,以此来缓存页输出的部分内容。这一方式可缓存页中的特定内容,并不缓存整个页,因此每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。
缓存后替换与控件缓存正好相反。这种方式缓存整个页,但页中的各段都是动态的。例如,如果要创建一个在规定时间段内为静态的页,则可以将整个页设置为进行缓存。如果向页添加一个显示用户名的
Label
控件,则对于每次页刷新和每个用户而言,Label
的内容都将保持不变,始终显示缓存该页之前请求该页的用户的姓名。但是,使用缓存后替换机制,可以将页配置为进行缓存,但将页的个别部分标记为不可缓存。在此情况下,可以向不可缓存部分添加
Label 控件,这样将为每个用户和每次页请求动态创建这些控件。有关更多信息,请参见缓存 ASP.NET
页的某些部分。
根据请求参数缓存页
除缓存页的单一版本外,ASP.NET 页输出缓存还提供了一些功能,可以创建根据请求参数的不同而不同的页的多个版本。有关更多信息,请参见缓存页的多个版本。
自动移除数据
出于以下原因之一,ASP.NET 可以从缓存中移除数据:
-
由于服务器上的内存不足,开始一个称为“清理”的过程。
-
由于缓存中的项已过期。
-
由于项的依赖项发生了更改。
为了帮助管理缓存项,在将项从缓存中移除时,ASP.NET 会通知应用程序。
清理
清理是在内存不足时从缓存中删除项的过程。如果某些项在一段时间内未被访问,或是在添加到缓存中时被标记为低优先级,则这些项会被移除。ASP.NET 使用 CacheItemPriority
对象来确定要首先清理的项。有关更多信息,请参见如何:将项添加到缓存中。
过期
除了清理外,在缓存项过期时,ASP.NET 会自动从缓存中移除这些项。向缓存添加项时,可以按下表中的描述设置其过期时间。
过期类型 | 说明 |
---|---|
可调过期 |
指定某项自上次被访问后多长时间过期。例如,可以将某项设置为自上次在缓存中被访问后 20 分钟过期。 |
绝对过期 |
指定某项在设定的时间过期,而不考虑访问频率。例如,可以将某项设置为在 6:00 PM |
依赖项
可以将缓存中某一项的生存期配置为依赖于其他应用程序元素,如某个文件或数据库。当缓存项依赖的元素更改时,ASP.NET
将从缓存中移除该项。例如,如果您的网站显示一份报告,该报告是应用程序通过 XML 文件创建的,您可以将该报告放置在缓存中,并将其配置为依赖于该 XML 文件。当
XML 文件更改时,ASP.NET
会从缓存中移除该报告。当代码请求该报告时,代码会先确定该报告是否在缓存中,如果不在,代码会重新创建该报告。因此,始终都有最新版本的报告可用。
ASP.NET 缓存支持下表中描述的依赖项。
依赖项 | 说明 |
---|---|
键依赖项 |
应用程序缓存中的项存储在键/值对中。键依赖项允许项依赖于应用程序缓存中另一项的键。如果移除了原始项,则具有键依赖关系的项也会被移除。例如,可以添加一个名为 |
文件依赖项 |
缓存中的项依赖于外部文件。如果该文件被修改或删除,则缓存项也会被移除。 |
SQL 依赖项 |
缓存中的项依赖于 Microsoft SQL Server 2005、SQL Server 2000 或 SQL Server 7.0 |
聚合依赖项 |
通过使用 AggregateCacheDependency |
自定义依赖项 |
可以用您自己的代码创建的依赖关系来配置缓存中的项。例如,可以创建一个自定义 Web 服务缓存依赖项,当调用 Web |
应用程序缓存项移除通知
当项从应用程序缓存中移除时,您可以收到通知。例如,如果有一个需要大量处理时间才能创建的项,当从缓存中移除该项时,您会收到通知以便可以立即替换该项。这样,下次请求该项时,用户便不必等待处理该项。有关更多信息,请参见如何:从缓存中移除项时通知应用程序。
ASP.NET 2.0 版保留了 ASP.NET 1.1
版的所有缓存功能,同时添加了新功能并增强了现有功能。新功能包括缓存配置文件、自定义缓存依赖项、SQL
缓存依赖项以及在缓存页中创建动态内容(缓存后替换)。增强功能包括功能更强大的部分页(控件)缓存模型、增强的缓存配置以及输出缓存指令的改进。
新缓存功能
缓存配置文件
缓存配置文件使您能够在应用程序的 Web.config
文件中创建缓存设置,然后在单个页上引用这些设置。这使您能够将缓存设置同时应用于多页。例如,可以定义一个名为 DailyUpdate
的缓存配置文件,它将页的缓存持续时间设置为一天。然后可以配置各个页使用 DailyUpdate 缓存配置文件,并且这些页的缓存持续时间为一天。如果将
DailyUpdate 缓存配置文件更改为不使用缓存,将停止缓存这些页。有关更多信息,请参见 ASP.NET
中的缓存配置。
自定义缓存依赖项
在 ASP.NET 2.0 中,您可以根据应用程序特定情况创建自己的自定义缓存依赖项。若要创建自定义缓存依赖项,请创建从 CacheDependency
继承的类并在自定义类中实现您自己的依赖项方法。例如,您可以创建在 Web
服务中轮询数据的依赖项;当数据发生变化时,您可以使缓存数据无效。若要了解通过指定依赖项向缓存添加项目的信息,请参见如何:将项添加到缓存中。
SqlCacheDependency
ASP.NET 2.0 引入了 SqlCacheDependency
类,它使您能够在缓存中配置一个项,以便在 Microsoft SQL Server
数据库中的表或行上拥有依赖项。当表中或特定行中发生更改时,具有依赖项的缓存项便会失效并从缓存中移除。ASP.NET 2.0 使您能够在 SQL Server
7.0、SQL Server 2000 和 SQL Server 2005 中设置表的依赖项。使用 SQL Server 2005
时,您还可以设置特定记录的依赖项。有关更多信息,请参见使用
SqlCacheDependency 类在 ASP.NET 中缓存。
缓存后替换
ASP.NET 2.0
现在支持缓存后替换,使您能够将页中的某一部分配置为不可缓存。因此,尽管缓存了该页,但在再次请求该页时,将重新处理它的部分内容。例如,您可以使用大多数静态内容(但不能使用在
Label
控件中显示用户名的内容)创建缓存页。如果不使用缓存后替换,用户名在所有请求中保持不变。如果使用缓存后替换,您可以将页标记为可缓存,然后将
Label 控件放置在标记为不可缓存的另一个控件中。此后每次请求该页时,都会刷新用户名。有关更多信息,请参见缓存 ASP.NET
页的某些部分。
缓存增强
控件缓存
在 ASP.NET 1.1 中,通过设置 @
Control 指令中的参数以声明方式配置用户控件缓存。在 ASP.NET 2.0 中,可以在运行时使用 CachePolicy
对象配置用户控件缓存设置。CachePolicy 对象使您能够按照以编程方式处理页输出缓存的相同方式处理用户控件缓存。有关更多信息,请参见缓存 ASP.NET
页的某些部分。
缓存配置增强
除了缓存配置文件外,ASP.NET 2.0 中还引入了新的缓存配置设置,可以在应用程序的 Web.config
文件中指定这些设置。这些设置增加了您对缓存的控制,如内存使用量和缓存清理行为。有关更多信息,请参见 ASP.NET
中的缓存配置。
输出缓存指令改进
ASP.NET 2.0 包括新的 @
OutputCache 指令选项以及对现有选项的增强。新功能和增强功能使您能够对输出缓存功能进行声明控制,而以前只能使用 HttpCachePolicy
类以编程方式实现此类控制。例如,现在可以用声明方式设置页 @
OutputCache 指令中的 Duration
属性和 NoStore
属性。有关更多信息,请参见设置页的可缓存性。
ASP.NET
为您提供了一个强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。
缓存是由 Cache
类实现的;缓存实例是每个应用程序专用的。缓存生存期依赖于应用程序的生存期;重新启动应用程序后,将重新创建 Cache 对象。
设计 Cache 类是为了便于使用。您可以将项放置在 Cache
中,并在以后使用简单的键/值对来检索这些项。有关如何执行此操作的示例,请参见如何:将项添加到缓存中和如何:检索缓存项的值。
Cache
类提供了强大的功能,允许您自定义如何缓存项以及将它们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术也称为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。
当执行清理时,您可以指示 Cache 给予某些项比其他项更高的优先级。若要指示项的重要性,可以在使用 Add
或 Insert
方法添加项时指定一个 CacheItemPriority
枚举值。
当使用 Add 或 Insert 方法将项添加到缓存时,您还可以建立项的过期策略。您可以通过使用 DateTime
值指定项的确切过期时间(绝对过期时间),来定义项的生存期。也可以使用 TimeSpan
值指定一个弹性过期时间,弹性过期时间允许您根据项的上次访问时间来指定该项过期之前的运行时间。一旦项过期,便将它从缓存中移除。试图检索它的值的行为将返回
null(在 Visual Basic 中为 Nothing),除非该项被重新添加到缓存中。
对于存储在缓存中的易失项(例如那些定期进行数据刷新的项或那些只在一段时间内有效的项),通常设置一种过期策略:只要这些项的数据保持为最新的,就将它们保留在缓存中。例如,如果您正在编写一个应用程序,该应用程序通过另一个网站获取数据来跟踪体育比赛的比分,那么只要源网站上比赛的比分不更改,就可以缓存这些比分。在此情况下,您可以根据其他网站更新比分的频率来设置过期策略。您可以编写代码来确定缓存中是否是最新的比分。如果该比分不是最新的,则代码可以从源网站读取比分并缓存新值。
最后,ASP.NET
允许您根据外部文件、目录(文件依赖项)或另一个缓存项(键依赖项)来定义缓存项的有效性。如果具有关联依赖项的项发生更改,缓存项便会失效并从缓存中移除。您可以使用该技术在项的数据源更改时从缓存中移除这些项。例如,如果您编写一个处理
XML 文件中的财务数据的应用程序,则可以从该文件将数据插入缓存中并在此 XML 文件上保留一个依赖项。当该文件更新时,从缓存中移除该项,您的应用程序重新读取
XML 文件,然后将刷新后的数据放入缓存中。
注意 |
---|
Cache ASP.NET 中的缓存配置
ASP.NET 提供了许多可用于配置页面输出缓存和缓存 API 页面输出缓存配置您可以在以下这些位置配置页面输出缓存:
Web.config 缓存配置设置在 Web.config 文件中,有两个顶级配置节可用于页输出缓存:OutputCacheSection OutputCacheSection 节用于配置应用程序范围的设置,例如是启用还是禁用页输出缓存。例如,您可以通过向 Web.config OutputCacheSettingsSection 用于配置可由单个页使用的配置文件和依赖项。例如,下面的代码创建了一个名为 <outputCacheSettings> Machine.config 缓存配置设置Machine.config 文件的配置节与 Web.config 文件的配置节基本相同,而只有一点区别:即可以锁定 Machine.config 页面缓存配置设置通过应用在配置文件中定义的缓存配置文件,可以配置单个页中的缓存。也可以在 @ 用户控件缓存配置设置通过设置用户控件文件中的 @ 缓存 API 配置设置可以在 Web.config 文件中配置应用程序的缓存 API。对于页面输出缓存,应用程序宿主可以在 Machine.config <cache disableExpiration="true" /> 还可以通过为属性(如配置文件的 CacheSection 中的 DisableExpiration |
可以使用 Cache
对象访问应用程序缓存中的项。可以使用 Cache 对象的 Insert
方法向应用程序缓存添加项。该方法向缓存添加项,并且通过几次重载,您可以用不同选项添加项,以设置依赖项、过期和移除通知。如果使用 Insert
方法向缓存添加项,并且已经存在与现有项同名的项,则缓存中的现有项将被替换。
还可以使用 Add
方法向缓存添加项。使用此方法,您可以设置与 Insert 方法相同的所有选项;然而,Add
方法将返回您添加到缓存中的对象。另外,如果使用 Add 方法,并且缓存中已经存在与现有项同名的项,则该方法不会替换该项,并且不会引发异常。
本主题中的过程阐释了向应用程序缓存添加项的如下方式:
-
通过键和值直接设置项,向缓存添加项。
-
使用 Insert 方法向缓存添加项。
-
向缓存添加项并添加依赖项,以便当该依赖项更改时,将该项从缓存中移除。可以基于其他缓存项、文件和多个对象设置依赖项。
-
将设有过期策略的项添加到缓存中。除了能设置项的依赖项以外,还可以设置项在一段时间以后(弹性过期)或在指定时间(绝对过期)过期。您可以定义绝对过期时间或弹性过期时间,但不能同时定义两者。
-
向缓存添加项,并定义缓存的项的相对优先级。相对优先级帮助 .NET Framework
确定要移除的缓存项;较低优先级的项比较高优先级的项先从缓存中移除。 -
通过调用 Add 方法添加项。
除了这里显示的依赖项,可以在 SQL Server 表上或基于自定义依赖项创建依赖项。有关更多信息,请参见 ASP.NET
缓存概述和使用
SqlCacheDependency 类在 ASP.NET 中缓存。
当从缓存中移除项时,还可以使用 CacheItemRemovedCallback
委托让应用程序缓存通知应用程序。有关完整示例,请参见如何:从缓存中移除项时通知应用程序。
通过键和值直接设置项向缓存添加项
-
通过指定项的键和值,像将项添加到字典中一样将其添加到缓存中。
下面的代码示例将名为 CacheItem1 的项添加到 Cache 对象中:
C#Cache["CacheItem1"] = "Cached Item 1";
Visual BasicCache("CacheItem1") = "Cached Item 1"
通过使用 Insert 方法将项添加到缓存中
-
调用 Insert 方法,传递要添加的项的键和值。
下面的代码示例添加名为 CacheItem2 的字符串:
C#Cache.Insert("CacheItem2", "Cached Item 2");
Visual BasicCache.Insert("CacheItem2", "Cached Item 2")
通过指定依赖项向缓存添加项
-
调用 Insert 方法,将 CacheDependency
对象的一个实例传递给该方法下面的代码示例添加名为 CacheItem3 的项,该项依赖于缓存中名为 CacheItem2 的另一个项:
C#string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
new System.Web.Caching.CacheDependency(null, dependencies));Visual BasicDim dependencies As String() = {"CacheItem2"}
Cache.Insert("CacheItem3", "Cached Item 3", _
New System.Web.Caching.CacheDependency( _
Nothing, dependencies))下面的代码示例演示将名为 CacheItem4 的项添加到缓存中,并且在名为 XMLFile.xml 的文件上设置文件依赖项:
C#Cache.Insert("CacheItem4", "Cached Item 4",
new System.Web.Caching.CacheDependency(
Server.MapPath("XMLFile.xml")));Visual BasicCache.Insert("CacheItem4", "Cached Item 4", _
New System.Web.Caching.CacheDependency( _
Server.MapPath("XMLFile.xml")))下面的代码示例演示如何创建多个依赖项。它向缓存中名为 CacheItem1 的另一个项添加键依赖项,向名为 XMLFile.xml
的文件添加文件依赖项。C#System.Web.Caching.CacheDependency dep1 =
new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));
string[] keyDependencies2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dep2 =
new System.Web.Caching.CacheDependency(null, keyDependencies2);
System.Web.Caching.AggregateCacheDependency aggDep =
new System.Web.Caching.AggregateCacheDependency();
aggDep.Add(dep1);
aggDep.Add(dep2);
Cache.Insert("CacheItem5", "Cached Item 5", aggDep);Visual BasicDim dep1 As CacheDependency = _
New CacheDependency(Server.MapPath("XMLFile.xml"))
Dim keyDependencies2 As String() = {"CacheItem1"}
Dim dep2 As CacheDependency = _
New System.Web.Caching.CacheDependency(Nothing, _
keyDependencies2)
Dim aggDep As AggregateCacheDependency = _
New System.Web.Caching.AggregateCacheDependency()
aggDep.Add(dep1)
aggDep.Add(dep2)
Cache.Insert("CacheItem5", "Cached Item 5", aggDep)
将设有过期策略的项添加到缓存中
-
调用 Insert 方法,将绝对过期时间或弹性过期时间传递给该方法。
下面的代码示例将有一分钟绝对过期时间的项添加到缓存中:
C#Cache.Insert("CacheItem6", "Cached Item 6",
null, DateTime.Now.AddMinutes(1d),
System.Web.Caching.Cache.NoSlidingExpiration);Visual BasicCache.Insert("CacheItem6", "Cached Item 6", _
Nothing, DateTime.Now.AddMinutes(1.0), _
TimeSpan.Zero)下面的代码示例将有 10 分钟弹性过期时间的项添加到缓存中:
C#Cache.Insert("CacheItem7", "Cached Item 7",
null, System.Web.Caching.Cache.NoAbsoluteExpiration,
new TimeSpan(0, 10, 0));Visual BasicCache.Insert("CacheItem7", "Cached Item 7", _
Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, _
New TimeSpan(0, 10, 0))
将设有优先级设置的项添加到缓存中
-
调用 Insert 方法,从 CacheItemPriority
枚举中指定一个值。下面的代码示例将优先级值为 High
的项添加到缓存中:C#Cache.Insert("CacheItem8", "Cached Item 8",
null, System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.High, null);Visual BasicCache.Insert("CacheItem8", "Cached Item 8", _
Nothing, System.Web.Caching.Cache.NoAbsoluteExpiration, _
System.Web.Caching.Cache.NoSlidingExpiration, _
System.Web.Caching.CacheItemPriority.High, _
Nothing)
使用 Add 方法向缓存添加项
-
调用 Add 方法,它返回一个表示项的对象。
下面的代码示例向缓存添加名为 CacheItem9 的项,同时将变量 CachedItem9
的值设置为已添加的项。C#string CachedItem9 = (string)Cache.Add("CacheItem9",
"Cached Item 9", null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Default,
null);Visual BasicDim CachedItem9 As String = CStr(Cache.Add("CacheItem9", _
"Cached Item 9", Nothing, _
System.Web.Caching.Cache.NoAbsoluteExpiration, _
System.Web.Caching.Cache.NoSlidingExpiration, _
System.Web.Caching.CacheItemPriority.Default, _
Nothing))
如何:检索缓存项的值要从缓存中检索数据,应指定存储缓存项的键。不过,由于缓存中所存储的信息为易失信息,即该信息可能由 ASP.NET 移除,因此建议的开发模式是首先确定该项是否在缓存中。如果不在,则应将它重新添加到缓存中,然后检索该项。
检索缓存项的值
通过在 Cache 对象中进行检查来确定该项是否不为 null(在 Visual Basic 中为 Nothing)。如果该项存在,则将它分配给变量。否则,重新创建该项,将它添加到缓存中,然后访问它。
下面的代码示例演示如何从缓存中检索名为 CacheItem 的项。代码将该项的内容分配给名为 cachedString 的变量。如果该项不在缓存中,则代码会将它添加到缓存中,然后将它分配给 cachedString。
C#string cachedString;
cachedString = (string)Cache["CacheItem"];
if (cachedString == null)
{
cachedString = "Hello, World.";
Cache.Insert("CacheItem", cachedString);
}Visual BasicDim cachedString As String
cachedString = CStr(Cache("CacheItem"))
If cachedString Is Nothing Then
cachedString = "Hello, World."
Cache.Insert("CacheItem", cachedString)
End If如何:从缓存中移除项时通知应用程序在大多数缓存方案中,当从缓存中移除项后,直到再次需要此项时,才需要将其放回缓存中。典型的开发模式是在使用项之前始终检查该项是否已在缓存中。如果项位于缓存中,则可以使用。如果不在缓存中,则应再次检索该项,然后将其添加回缓存。
但是,在某些情况下,如果从缓存中移除项时通知应用程序,可能非常有用。例如,您可能具有一个缓存的报告,创建该报告需花费大量的时间进行处理。当该报告从缓存中移除时,您希望重新生成该报告,并立即将其置于缓存中,以便下次请求该报告时,用户不必等待对此报告进行处理。
为了在从缓存中移除项时能够发出通知,ASP.NET 提供了 CacheItemRemovedCallback 委托。该委托定义编写事件处理程序时使用的签名,当对从缓存中移除项进行响应时会调用此事件处理程序。ASP.NET 还提供 CacheItemRemovedReason 枚举,用于指定移除缓存项的原因。
通常,通过在管理尝试检索的特定缓存数据的业务对象中创建处理程序,来实现回调。例如,您可能有一个 ReportManager 对象,该对象具有两种方法,即 GetReport 和 CacheReport。GetReport 报告方法检查缓存以查看报告是否已缓存;如果没有,该方法将重新生成报告并将其缓存。CacheReport 方法具有与 CacheItemRemovedCallback 委托相同的函数签名;从缓存中移除报告时,ASP.NET 会调用 CacheReport 方法,然后将报告重新添加到缓存中。
当从缓存中移除项时通知应用程序
创建一个类,负责从缓存中检索项并处理回调方法,以将项添加回缓存中。
在该类中,创建用于将项添加到缓存中的方法。
在该类中,创建用于从缓存中获取项的方法。
创建用于处理缓存项移除回调的方法。该方法必须具备与 CacheItemRemovedCallback 委托相同的函数签名。从缓存中删除项时,会在该方法中执行要运行的逻辑,如重新生成项并将其添加回缓存中。
测试缓存项回调
创建一个 ASP.NET 网页,该网页将调用类中用于将项添加到缓存中的方法。
下面的代码示例演示如何调用 ReportManager 类的 GetReport 方法(在此过程后面的示例中定义)。然后将在使用页面的 Page_Load 方法期间显示 Label 控件 Label1 中的报告。
C#protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = ReportManager.GetReport();
}Visual BasicProtected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Me.Label1.Text = ReportManager.GetReport()
End Sub在浏览器中请求 ASP.NET 页并查看报告。
报告是在首次请求页时创建的,在缓存中的报告被移除之前,后续请求都将访问缓存中的报告。
示例
下面的代码示例演示一个名为 ReportManager 的、用于在从缓存中删除项时处理通知的完整类。该类管理字符串形式的报告,此报告表示一个长期运行的进程。
尽管该示例使用声明为 static(在 Visual Basic 中为 Shared)的类,但并不是必须使用静态类。不过,删除缓存项时,用于处理回调的方法必须存在。例如,不应在 ASP.NET 页中实现回调处理程序,因为在从缓存中删除项之前该页可能已被释放,因此用于处理回调的方法将不可用。为了确保从缓存中删除项时处理回调的方法仍然存在,请使用该方法的静态类。但是,静态类的缺点是需要保证所有静态方法都是线程安全的。
警告 请不要在页面中将 CacheItemRemovedCallback 设置为一个方法。除了在释放页面后回调无法使用页面方法以外,将回调指向页面方法还会阻碍垃圾回收将页面使用的内存回收。由于回调包含对页面的引用,而垃圾回收器不会从内存中移除包含任何引用的项,因此会出现这种情况。在加载应用程序期间,这可能会导致内存很快被用光。
该示例类包括以下功能:
私有成员,用于跟踪报告是否已从缓存中移除。
名为 CacheReport 的方法,用于将项以 MyReport 的名称添加到缓存中,并将该项设置为在添加到缓存中后一分钟过期。该方法还会将 ReportRemovedCallback 方法传递给 onRemoveCallback 参数,从而注册 ReportRemoveCallback 方法,以便在从缓存中删除项时进行调用。
名为 GetReport 的方法,用于从缓存中获取项。该方法确定名为 MyReport 的项是否存在于缓存中。如果该项不存在,则该方法将调用 CacheReport,,将该项添加到缓存中。
名为 ReportRemovedCallback 的方法,用于处理缓存项移除回调。ReportRemovedCallback 具有与 CacheItemRemovedCallback 委托相同的函数签名。该方法将变量 _reportRemovedFromCache 设置为 true,然后通过 CacheReport 方法将项添加回缓存中。
C#