蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 673, 评论 - 4385, 引用 - 276

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • Vdrpkkwy
    I love this site <a href=" http://www.wikio.com/user/cajamosoyd/bio "&g...
    by Vdrpkkwy(匿名) on 2010/3/21 14:11:18
  • Ypecdzxw
    I'm happy very good site <a href=" http://www.wikio.com/user/siitaqepu/bio &quot...
    by Ypecdzxw(匿名) on 2010/3/21 14:10:43
  • Rqxairig
    I love this site <a href=" http://www.wikio.com/user/odiypumunu/bio "&g...
    by Rqxairig(匿名) on 2010/3/21 14:10:19
  • Xoineqxt
    Cool site goodluck :) <a href=" http://www.wikio.com/user/acukioe/bio "&...
    by Xoineqxt(匿名) on 2010/3/21 13:25:17
  • Hitcrako
    Good crew it's cool :) <a href=" http://www.wikio.com/user/ykosikaguahi/bio &quo...
    by Hitcrako(匿名) on 2010/3/21 13:25:12
  • Zgdamale
    i'm fine good work <a href=" http://www.wikio.com/user/ykosikaguahi/bio "&a...
    by Zgdamale(匿名) on 2010/3/21 13:24:52
  • Olzoqtkz
    Good crew it's cool :) <a href=" http://www.wikio.com/user/ykosikaguahi/bio &quo...
    by Olzoqtkz(匿名) on 2010/3/21 12:06:19
  • Sosrijuo
    Wonderfull great site <a href=" http://www.wikio.com/user/ykosikaguahi/bio &quot...
    by Sosrijuo(匿名) on 2010/3/21 12:05:25
  • Mflounob
    Jonny was here <a href=" http://www.wikio.com/user/ykosikaguahi/bio "&g...
    by Mflounob(匿名) on 2010/3/21 12:05:03
  • Ciwjqcmd
    real beauty page <a href=" http://www.wikio.com/user/cikocahusiger/bio "&am...
    by Ciwjqcmd(匿名) on 2010/3/21 11:17:24

广告

企业库缓存应用程序块和ASP.net的缓存,过期检查功能比较

企业库缓存应用程序块和ASP.net的缓存,过期检查功能比较

首先我们来看ASP.net 中自带的缓存

不论你使用的是HttpContext.Cache 还是 HttpRuntime.Cache,他们其实都是System.Web.Caching.Cache 类。
在给这个缓存增加缓存项功能时候,你就指定了这个缓存项的过期机制:
这个缓存类的增加缓存项函数如下:
public Object Add (
	string key,
	Object value,
	CacheDependency dependencies,
	DateTime absoluteExpiration,
	TimeSpan slidingExpiration,
	CacheItemPriority priority,
	CacheItemRemovedCallback onRemoveCallback
)

其中的CacheDependency dependencies 参数就是你需要增加的缓存到底是何种过期机制。

在ASP.net中 CacheDependency 类只提供了少数几个缓存过期的情况。MSDN中对此有详细的描述,如下:

 对存储于 ASP.NET 应用程序的 Cache 对象中的项与文件、缓存键、文件或缓存键的数组或另一个 CacheDependency 对象之间建立依附性关系。CacheDependency 类监视依附性关系,以便在任何这些对象更改时,该缓存项都会自动移除。

我们使用 Reflector 则可以看到更多有意思的东西。

CacheDependency  类的 private void Init(bool isPublic, string[] filenamesArg, string[] cachekeysArg, CacheDependency dependency, DateTime utcStart) 方法中,我们可以看到如下代码:

....
CacheDependency.DepFileInfo[] infoArray2 = new CacheDependency.DepFileInfo[num1];
FileChangeEventHandler handler1 = new FileChangeEventHandler(this.FileChange);
FileChangesMonitor monitor1 = HttpRuntime.FileChangesMonitor;
foreach (CacheDependency.DepFileInfo info2 in infoArray1)
{
    string text4 = info2._filename;
    monitor1.StartMonitoringPath(text4, handler1, out infoArray2[num2]._fad);
    infoArray2[num2]._filename = text4;
    num2++;
}
....

由上述代码可知ASP.net的Cache,如果依赖于文件,则系统自动监控这些文件。

监控这些文件的核心代码,分别在以下四个类中:

System.Web.FileChangesMonitor 类中可以看到如下代码:

internal DateTime StartMonitoringFile(string alias, FileChangeEventHandler callback)
{
....
FileMonitor monitor1;
DirectoryMonitor monitor2;
monitor1 = monitor2.StartMonitoringFile(text3, callback, alias);
....
}

System.Web.DirectoryMonitor 类中可以看到如下代码:
internal FileMonitor StartMonitoringFile(string file,
    FileChangeEventHandler callback, string alias){
.....
this.StartMonitoring();
.....
}
以及:
private void StartMonitoring(){
....
this._dirMonCompletion = new DirMonCompletion(this,
    this.Directory, this._watchSubtree, this._notifyFilter);
....
}
 
System.Web.DirMonCompletion 类中我们看他的构造函数
internal DirMonCompletion(DirectoryMonitor dirMon, string dir,
    bool watchSubtree, uint notifyFilter){
....
int num1 = UnsafeNativeMethods.DirMonOpen(dir, watchSubtree,
      notifyFilter, notification1, out this._ndirMonCompletionPtr);
....
}

以及他的销毁中调用的函数:
private void Dispose(bool disposing){
.....
UnsafeNativeMethods.DirMonClose(this._ndirMonCompletionHandle);
.....
}

而上述两个函数在 System.Web.UnsafeNativeMethods 类中

[ComVisible(false), SuppressUnmanagedCodeSecurity]
internal sealed class UnsafeNativeMethods
{

  [DllImport("webengine.dll", CharSet=CharSet.Unicode)]
  internal static extern int DirMonOpen(string dir, bool watchSubtree, uint notifyFilter, NativeFileChangeNotification callback, out IntPtr pCompletion);

  [DllImport("webengine.dll")]
  internal static extern void DirMonClose(HandleRef dirMon);
}

这样我们一直看下去后,可以看到,ASP.net 的基于文件的Cache,最终依赖于以下两个非托管代码。而这两个托管代码是实现的监控文件修改。

至于依赖于缓存健的缓存,则是在该缓存健过期是,同步通知依赖于他的项。

所以,可以简单的认为,ASP.net 的Cache 只依赖于文件,或者文件的数组。以及在此基础上的进一步封装。

我们再来看企业库中缓存的过期机制:

企业库在给缓存中新增一项缓存的时候,也会指明缓存的过期机制。这个增加函数原型如下:

 public void Add ( string key, Object value, CacheItemPriority scavengingPriority, ICacheItemRefreshAction refreshAction, params ICacheItemExpiration[] expirations )

最后一项为缓存过期机制,这个参数是params 参数,并且,这个参数要求是 遵循 ICacheItemExpiration 接口的一个实现。

ICacheItemExpiration 接口中其中定义了过期检查接口  bool HasExpired();

查看企业库的源代码会发现,增加缓存项的代码中有如下代码:

cacheScavenger.StartScavenging();  即,确保增加后,同时开始对这项进行检查,看是否满足过期机制。

在企业库中,由于有多种缓存过期机制需要考虑,而且用户可以自己实现自己的缓存过期机制。他的缓存过期机制就采用了定时检查是否过期,

甚至是依赖于文件的过期机制,也是这样。

总结:

1、ASP.net 的Cache由于归根到底是依赖于文件的Cache。
注意,ASP.net 用到的Cache,可不是依赖于System.IO.FileSystemWatcher ,而是微软自己封装的非托管代码。
System.IO.FileSystemWatcher 是依赖于非托管代码:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern unsafe bool ReadDirectoryChangesW(SafeFileHandle hDirectory, HandleRef lpBuffer, int nBufferLength, int bWatchSubtree, int dwNotifyFilter, out int lpBytesReturned, NativeOverlapped* overlappedPointer, HandleRef lpCompletionRoutine);


2、企业库的Cache 是一个更广泛意义上的Cache。为了保证这个广泛性,他在性能上作了一些牺牲,单独开一个线程定时检查是否需要过期。

 

 

 

posted on 2006-09-26 19:41:00 by ghj1976  评论(6) 阅读(7318)

企业库昨天出了一个Patch,主要是信任级别的修复

如果你使用企业库,一直运行在完全信任(full trust),则不需要这个 Patch。只有你需要运行在部分信任级别下时候,才需要这个补丁。

部分信任(partial trust)的典型场景是:ASP.net 应用。

这个补丁的下载地址:
Patch 2554 for EntLib Jan 2006 - Partial Trust Support
http://www.gotdotnet.com/codegallery/news/newsitem.aspx?id=295a464a-6072-4e25-94e2-91be63527327&newsId=8558c688-434b-4b32-b8af-799f681b8eca

posted on 2006-07-01 10:56:00 by ghj1976  评论(5) 阅读(6650)

序列化的一些小知识:

1、默认情况下,类型中由 SerializableAttribute 标记的所有公共和私有字段都会进行序列化,除非该类型实现 ISerializable 接口来重写序列化进程。

2、默认的序列化进程会排除用 NonSerializedAttribute 属性标记的字段。如果可序列化类型的字段包含指针、句柄或其他某些针对于特定环境的数据结构,并且不能在不同的环境中以有意义的方式重建,则最好将 NonSerializedAttribute 属性应用于该字段。

我和同事最近在作的项目中,用了微软企业库的来处理缓存,而这个缓存又是封装在企业服务中。

要封在企业服务中的组件必须签名,同时他暴露的输入输出参数必须被序列化。
我们就是没留意到标志序列化默认也会把私有字段进行序列化。而产生下面的异常。

程序集“Microsoft.Practices.EnterpriseLibrary.Caching, Version=2.0.0.0, Culture=neutral, PublicKeyToken=.....”中的类型“Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager”未标记为可序列化。

不过,
如果发生了跨组件类暴露,比如企业服务A组件项目中暴露了B组件项目的一个公共类C。而C类中又有一个私有类实例D,

而D类被定义成internal的。则这个企业服务组件项目不会自动序列化D类。
但是如果D类被定义成public的,则会自动序列化D类。

posted on 2006-06-01 17:42:00 by ghj1976  评论(3) 阅读(7562)

Enterprise Library 强签名的问题

如果你自己的项目用到了基于.net2.0的 Enterprise Library - January 2006,并且你的项目是需要强签名的。这时候你就需要对企业库的代码作少量的修改,让企业库涉及到的项目组件也支持强签名。

修改企业库,让它支持强签名,除了需要把每个项目指定签名文件外,还需要修改每个项目配置的友元程序集(Friend Assemblies)。

一个Assembly中所有的internal类型和internal成员,可以被它的友元程序集(Friend Assemblies)访问。
即如果AssemblyA中声明AssemblyB是它的Friend Assemblies,
则AssemblyB可以像访问自身一样访问AssemblyA的internal类型和internal成员。
但 AssemblyA 中的private类型和private成员仍然不可被AssemblyB访问。
上述设置AssemblyA 是不可以访问AssemblyB的internal类型。因为这个声明是单向的,不是双向的。

以下是对Enterprise Library - January 2006的具体修改步骤:
1、打开VS2005
的Visual Studio 2005 Command Prompt。

2、使用sn.exe 工具,生成一个 snk 文件   [sn -k keyfile.snk]

-k [keysize] outfile
生成一个指定大小的新 RSACryptoServiceProvider 密钥并将其写入指定的文件。公钥和私钥都写入该文件。
如果不指定密钥大小,并且已安装了 Microsoft Enhanced Cryptographic Provider,则默认情况下生成 1,024 位的密钥;否则,生成 512 位的密钥。

3、提取公钥到一个文件
[sn -p keyfile.snk publickey.pk]

-p infile outfile
从 infile 中的密钥对提取公钥并将其存储在 outfile 中。

4、 显示出公钥,这个一定要记住,后面用。
[sn -tp publickey.pk]

-t[p] infile
显示存储在 infile 中的公钥的标记。infile 的内容必须是以前使用 -p 从密钥对文件生成的公钥。不要使用 -t[p] 选项直接从密钥对文件提取该标记。

5、给企业库中,你需要到的项目进行签名,注意项目之间的互相引用,如果搞不清楚这些关系,那就给所有项目配置签名。

对于每个项目,都通过下面步骤来指定签名
a)在Solution Explorer中选择每一个项目,然后在右键中选择属性(项目的属性)
b)属性页中选择“Signing”页,然后选中“Sign the assembly” 选择框。然后在下拉列表框中选择“Browse…”,选择第二步创建的snk文件。
c) 保存并关闭属性页,

整个企业库 54 个项目,如果你一个个的都这么设置的话,比较累。
网上已经有人开发了一个工具,可以来配置多个项目。
这个工具在下述地址下载。
http://spaces.msn.com/misopiniones/blog/cns!2737DC89A4AAB26B!623.entry

6、在整个解决方案中搜索 InternalsVisibleTo,然后把第4步获得的公钥Copy出来。
修改如下代码成类似后面这样的:

[assembly: InternalsVisibleTo("Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Tests")}

[assembly: InternalsVisibleTo("Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Tests,

PublicKey=00240000048000009400000006024*********3D7B62BCB24A160C64F8")]

注意:不是PublicKeyToken,是PublicKey
如果你用PublicKeyToken的话,会报如下错误:
Friend assembly reference 'Microsoft.Practices.EnterpriseLibrary.Common.Tests,PublicKeyToken=b34627b8a52c2536' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations.

 

7、保存整个解决方案。

8、编译整个解决方案。

参考:

强名称工具 (Sn.exe)  参数介绍
http://msdn2.microsoft.com/zh-cn/library/k5b5tt23.aspx

InternalsVisibleToAttribute,友元程序集访问属性
http://vitoriatang.cnblogs.com/archive/2005/11/22/282201.aspx

http://spaces.msn.com/misopiniones/blog/cns!2737DC89A4AAB26B!624.entry

http://blogs.msdn.com/tomholl/archive/2005/12/02/499529.aspx

posted on 2006-05-16 13:24:00 by ghj1976  评论(12) 阅读(10328)

Web 下配置文件信息的读写

注:这算是对上篇".net 下配置文件的操作"的补充,这里借用了上面的已有示例代码。
上篇 Blog  在  http://blog.joycode.com/ghj/archive/2006/02/10/71293.aspx

WEB 下配置文件的读写跟 客户端应用程序配置文件 下 对配置文件的读写,几乎完全是一样的。只不过 , web.config 有多重继承的问题。
子网站目录下如果没配置,会继承自上级目录。依次类推,这是一个多层继承的问题。

同样是上篇 Blog 的配置类 ,我们下面来看看 Web 下的读写操作
using System.Web.Configuration;

写操作:
卸载掉原来节,新增节来写操作
        ConfigDataClass configData = new ConfigDataClass();
        configData.ID = 100;
        configData.Name = "我是谁?";
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        config.Sections.Remove("SettingsData");
        config.Sections.Add("SettingsData", configData);
        config.Save();

在原来节基础上的修改操作
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
        ConfigDataClass configData = config.GetSection("SettingsData") as ConfigDataClass;
        configData.ID = 1003;
        configData.Name = "我";
        config.Save();

读操作:
        ConfigDataClass configData = ConfigurationManager.GetSection("SettingsData") as ConfigDataClass;
        if (configData == null) return string.Empty;
        return configData.ToString();

从上面我们可以看到
除了
        Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
这一行代码 和 引用的 名称空间  using System.Web.Configuration; 不同外,Web 程序跟 客户端应用程序完全是一样的代码。

不论是 Web 程序,还是 客户端应用程序,有时候,一个配置文件是不够的,我们可能需要多个配置文件,下面我们就看看如何对其他配置文件当系统默认的配置文件来读写。
注意,我们这时候用的是 System.Configuration.Configuration 类,不论 Web 程序,还是 客户端应用程序 都可以用这个类。

更新指定的另外配置文件
        ConfigurationFileMap fileMap = new ConfigurationFileMap();
        fileMap.MachineConfigFilename = @"D:\My2005Codes\WebTestCode\TestWEBSite\aa.config";
        System.Configuration.Configuration config = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

        ConfigDataClass configData = new ConfigDataClass();
        configData.ID = 303;
        configData.Name = "CSDN?";

        config.Sections.Remove("SettingsData");
        config.Sections.Add("SettingsData", configData);
        config.Save();

在写操作之前,这个配置文件可以没有上述配置节,但是必须有下面几行信息,否则就会报没有根节点。
<?xml version="1.0"?>
<configuration>
</configuration>


完成写操作后,这个 aa.config 文件就变成了

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="SettingsData" type="ConfigDataClass, App_Code.yltp08ba, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <SettingsData id="303" name="CSDN?" />
</configuration>

读取指定的另外配置文件

        ConfigurationFileMap fileMap = new ConfigurationFileMap();
        fileMap.MachineConfigFilename = @"D:\My2005Codes\WebTestCode\TestWEBSite\aa.config";
        System.Configuration.Configuration config = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

        ConfigDataClass configData = config.GetSection("SettingsData") as ConfigDataClass;
        if (configData == null) return string.Empty;
        return configData.ToString();


如果是 客户端应用程序,你还可以 通过使用 System.Configuration.ConfigurationManager.OpenMappedExeConfiguration  读写多个客户端应用程序默认配置文件。

当然这些功能完全可以用类的序列化,反序列化来用,但是既然有这个功能,干么不用呢?

posted on 2006-02-11 09:08:00 by ghj1976  评论(3) 阅读(8031)

.net 2.0 中对配置文件的读写

在基于 .net 2.0 的企业库中,原来的配置应用程序块被废除了,使用了 .net 2.0 自带的读写配置功能,下面我们就来看看 .net 2.0 中读写配置的功能。

即:  ConfigurationManager  类

注意:
ConfigurationManager 是处理客户端应用程序配置文件的首选方法;不推荐使用任何其他方法。
对于 Web 应用程序,建议使用 WebConfigurationManager 类。

这个类的  AppSettings 属性 在以前1.0 的时候,就有了, 2.0 中增加了 ConnectionStrings 属性。
这些都不是今天我们要探讨的内容,我们今天要探讨的内容,是把一个配置类保存到配置文件中,以及把这个配置类从配置文件中实例化出来。

这个配置类,必须是 派生自
System.Configuration.ConfigurationSection 类

如下面的类就是一个配置类

using System.Text;
using System.Configuration;
namespace ConfigTest
{
    class ConfigDataClass : ConfigurationSection
    {
        public ConfigDataClass()
        { }

        [ConfigurationProperty("id")]
        public int ID{
            get{return (int)this["id"];}
            set{   this["id"] = value;}
        }

        [ConfigurationProperty("name")]
        public string Name{
            get{ return this["name"].ToString();}
            set{ this["name"] = value;}
        }

        public override string ToString(){
            StringBuilder info = new StringBuilder();
            info.AppendFormat("id = {0};name = {1}", ID, Name);
            return info.ToString();
        }
    }
}


先说如何把这个配置类更新到配置文件中

// 配置信息类初始化
ConfigDataClass configData = new ConfigDataClass();
configData.ID = 100;
configData.Name = "我是谁?";

// 打开当前文件的配置文件
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// 干掉原先的配置
config.Sections.Remove("SettingsData");
// 把新的配置更新上去
config.Sections.Add("SettingsData", configData);
// 保存配置文件
config.Save();

MessageBox.Show(configData.ToString());


读取配置信息

ConfigDataClass configData = ConfigurationManager.GetSection("SettingsData") as ConfigDataClass;
if (configData == null) return;
MessageBox.Show(configData.ToString());

当文件修改的时候,自动从新登录配置文件需求

这个更简单,只需要使用一个 System.IO.FileSystemWatcher 对象即可
private FileSystemWatcher watcher;

在初始化的时候,订阅文件改变事件。

// Initialize file system watcher
watcher = new FileSystemWatcher(AppDomain.CurrentDomain.BaseDirectory);
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
watcher.EnableRaisingEvents = false;

然后在 watcher_Changed 方法中,

private void watcher_Changed(object sender, FileSystemEventArgs e)
{
    if (e.FullPath.ToLower().Contains(".config"))
    {
  for (int i = 0; i < 3; i++)
  {
   try
   {
    // Using the static method, read the cached configuration settings
    ConfigurationManager.RefreshSection("EditorSettings");
    break;
   }
   catch (ConfigurationErrorsException)
   {
    if (i == 2) throw;
    else Thread.Sleep(100);
   }
  }
    }
}

显然,上述的功能已经能满足我们的需求了,所以企业库才废弃了之前的配置管理应用程序块。

posted on 2006-02-10 18:28:00 by ghj1976  评论(12) 阅读(10611)

2006年01月版企业库中缓存应用程序块

2006年01月版企业库中缓存应用程序块唯一发生变化的,就是跟整个企业库一样都抛弃了上一个版本的配置应用程序块。进而发生的变化。其他部分没有变化。

下面我们看一个简单的应用程序快的配置文件:

<configuration>
  <configSections>
    <section name="cachingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </configSections>
  <cachingConfiguration defaultCacheManager="Cache Manager">
    <cacheManagers>
      <add expirationPollFrequencyInSeconds="60" maximumElementsInCacheBeforeScavenging="1000"
        numberToRemoveWhenScavenging="10" backingStoreName="inMemory"
        name="Cache Manager" />
    </cacheManagers>
    <backingStores>
      <add encryptionProviderName="" type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        name="inMemory" />
    </backingStores>
  </cachingConfiguration>
</configuration>

在配置文件中,我可以可以看到一个缓存Manager 具有以下配置信息:
1、expirationPollFrequencyInSeconds  多少秒进行一次过期检查,缺省值60秒
2、maximumElementsInCacheBeforeScavenging 最多可以缓存对象数,超过这个个数,则触发清除事件,缺省值 1000;
3、numberToRemoveWhenScavenging  每次清除缓存项时候,按照优先级,清除掉优先级低的多少项。
4、backingStoreName  备份缓存的数据(辅助存储器 Backing Storage),备份保存在那里?默认备份不缓存。
系统默认提供了三种备份缓存存储方式
4.1、不缓存 Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore

4.2、缓存在数据库中  Microsoft.Practices.EnterpriseLibrary.Caching.Database.DataBackingStore
注意,这个类在 microsoft.practices.enterpriselibrary.caching.database.dll 文件中

4.3、缓存在一个隔离新的独立空间
Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.IsolatedStorageBackingStore 

上面我们看到的配置文件,采用的都是默认的缓存设置。

至于代码部分,则更简单,参看下面实例代码:
4.1
private CacheManager primitivesCache;

primitivesCache = CacheFactory.GetCacheManager();
primitivesCache.Add("1", 234);
primitivesCache.Add("12", "guohongjun");
primitivesCache.Add("33","www.csdn.net",
    CacheItemPriority.Normal,
    null,
    new SlidingTime(TimeSpan.FromMinutes(1)));

object obj1 = primitivesCache.GetData("1");
object obj2 = primitivesCache.GetData("12");
object obj3 = primitivesCache.GetData("33");

primitivesCache.Flush();

其中
CacheManager.Add (String, Object, CacheItemPriority, ICacheItemRefreshAction, ICacheItemExpiration[])

方法,函数的参数依次是:
1、缓存的主键
2、缓存的对象
3、缓存的优先级,如果缓存数量溢出,则系统自动清除优先级低的;
4、实现 ICacheItemRefreshAction  接口的类,用于缓存项目被卸载时候,接受消息通知用。如果你想这时候更新缓存项,则需要接受并处理这个事件。
5、缓存项过期依赖项。系统默认提供了以下几种过期方式:

5.1  指定时间点过期
示例代码如下,AbsoluteTime 的构造函数参数为 DateTime 类型参数:
primitivesCache.Add(.......,new AbsoluteTime(this.AbsoluteTime));

5.2 比如,你可能需要定义每周六晚上9点半过期,这时候,你就需要这种格式了。
这种格式具体的写法,请查看源代码  Expirations/ExtendedFormat.cs
这里的注释中有详细描述
primitivesCache.Add(.......,new ExtendedFormatTime("0 0 * * *")

5.3 文件被修改,则过期
primitivesCache.Add(.......,new FileDependency("DependencyFile.txt")

5.4 指定多长时间段之后
primitivesCache.Add(.......,new SlidingTime(TimeSpan.FromMinutes(1)));

5.5 当然还有不过期
primitivesCache.Add(.......,new NeverExpired());

当然你也可以自己写自己的过期机制。

参考:http://rickie.cnblogs.com/archive/2005/02/17/105013.aspx

posted on 2006-02-10 12:42:00 by ghj1976  评论(2) 阅读(7444)

Powered by: Joycode.MVC引擎 0.5.2.0