| zdnet china|2002-4-24
|
| 在先前的文章里,我详细讨论了.net缓存的简单用法。不过那点用途还只能是这一话题的“开胃酒”。现在,我们更进一步,在那篇文章所开发的缓存基础上添加条目在缓存中的过期功能。
清单a的内容就是上次我们开发的有关代码。 新缓存及其改进 我们首先修改insertcachedobject方法以支持缓存中对象的过期功能。当对象插入缓存时,该方法会给用户提供一个对象过期日期。这个日期参数被称为dtexpiration。insertcachedobject方法则存储经由该参数传递的过期日期。完成这一目标有若干方法。例如,我们可以创建一个封装对象,其中包含了日期和对象属性。如果这样做的话,insertcachedobject方法就会创建封装对象的实例并提供给它两个属性。我们选择相比更简单些的第二个方案:创建和声明第2个哈希散列表,并且指定它同第一个哈希散列表并行运行。这第二个哈希散列表叫做htexpiration。 对 insertcachedobject 方法的修改请见清单b。 现在,我们需要想办法发现过期的条目。在通过getcachedobject方法发出请求时,简单而且也是最偷懒的办法是检查每个缓冲对象。因为直到发出处理请求才调出过期对象,所以这是一种较差的算法。而且很有可能在时间上具有一定的不确定性。虽然这些到期对象驻留在缓存里,可是它们消费着珍贵的内存资源,这对应用程序的性能具有极其不利的影响。 不用这种偷懒的办法,我们创建一个后台线程反复检查htexpiration哈希表。 于是我们创建一个名叫thereaperthread的类,这个类有一个方法负责建立无限循环。该类还被声明为内部类,因为它只用在customcache对象的上下文环境内。该类的全部代码请见清单c。 你得对清单c中的shared constructor注意了,它负责创建新的线程并启动该线程。我们接下来创建测试程序保证缓存运行正常。测试程序见清单d,该程序是一个控制台程序,当然也可以用.net framework 把以上程序当作项目来创建。
小结 |
