é¦å æ们æ¥ç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ã为äºä¿è¯è¿ä¸ªå¹¿æ³æ§ï¼ä»å¨æ§è½ä¸ä½äºä¸äºçºç²ï¼åç¬å¼ä¸ä¸ªçº¿ç¨å®æ¶æ£æ¥æ¯å¦éè¦è¿æã
Â
Â