實作功能:定時重新整理Cache
錯誤了解:在使用Cache前,我個人了解是Cache會提供一個定時執行的方法。比如每隔10分鐘執行一項任務,而這個任務就要重新整理Cache。看MSDN上的文檔繞了很久才明白,是對參數的了解錯誤了。
MSDN示例:連結
了解事項:
1. 使用Cache.Add 方法要先檢查Cache[“Key”] (要添加的Key)是否存在,如果存在 Add時會報錯(未驗證),如果用Cache.Insert 方法則會更新目前Cache[“Key”] 。
2. Cache.Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);。其中 C#緩存absoluteExpiration、slidingExpiration兩個參數的疑惑,absoluteExpiration:用于設定絕對過期時間,它表示隻要時間一到就過期,是以類型為System.DateTime,當給這個參數設定了一個時間時,slidingExpiration參數的值就隻能為Cache.NoSlidingExpiration,否則出錯;slidingExpiration:用于設定可調過期時間,它表示當離最後通路超過某個時間段後就過期,是以類型為System.TimeSpan,當給這個參數設定了一個時間段時,absoluteExpiration的值就隻能為Cache.NoAbsoluteExpiration,否則出錯;
3. Cache.Add的參數
CacheItemRemovedCallback onRemoveCallback
是 從删除緩存項時的回調方法,删除操作包括:1,Cache.Remove(“Key1”) 操作 2,Cache的Expire過期值到了。而我錯我的了解是認為:我要的功能是定時更新,第3、4個參數可設定定時,可 更新(Update)怎麼和移除(Remove)聯系起來呢? 正确的了解應該是:當Cache過期了 或者被移除了的時候,Cache會自定去執行指定的委托,在這個委托關聯的方法裡可以根據需要實作如何重新整理Cache。MSDN說明 。
Cache["Key1"] = null;
将報錯,Cache[“Key1”] 值不能為 null。
4. 促使我了解的連結:從緩存中移除項時通知應用程式。裡面提到了緩存處理方案,也就是執行個體,這才能明白。
5. Cache.Insert的方法最後參數類型 CacheItemUpdateCallback表示:Cache項删除前要做的操作(了解上類似SqlServer中的Inserted、Deleted)。
6. .NET API MSDN連結 。
下面代碼說明:
1. 要執行代碼,可建立Web空項目,添加一個web窗體,并見代碼複制到裡面。
2. AddItemToCache()方法執行時,會添加一個key為”Key1”,value為”Value 1”的Cache,并設定當過期時間為60秒,當過期時或被移除時執行CacheItemRemovedCallback 委托關聯的RemovedCallback方法。
<html>
<Script runat=server language="C#">
// <snippet2>
static bool itemRemoved = false;
static CacheItemRemovedReason reason;
CacheItemRemovedCallback onRemove = null;
public void RemovedCallback(String k, Object v, CacheItemRemovedReason r){
itemRemoved = true;
reason = r;
}
// </snippet2>
// <snippet3>
public void AddItemToCache(Object sender, EventArgs e) {
itemRemoved = false;
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
if (Cache["Key1"] == null)
Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove);
}
// </snippet3>
// <snippet4>
public void RemoveItemFromCache(Object sender, EventArgs e) {
if(Cache["Key1"] != null)
Cache.Remove("Key1");
}
// </snippet4>
</Script>
<body>
<Form runat="server">
<input type=submit OnServerClick="AddItemToCache" value="Add Item To Cache" runat="server"/>
<input type=submit OnServerClick="RemoveItemFromCache" value="Remove Item From Cache" runat="server"/>
</Form>
<% if (itemRemoved) {
Response.Write("RemovedCallback event raised.");
Response.Write("<BR>");
Response.Write("Reason: <B>" + reason.ToString() + "</B>");
}
else {
// <snippet5>
Response.Write("Value of cache key: <B>" + Server.HtmlEncode(Cache["Key1"] as string) + "</B>");
// </snippet5>
}
%>
</body>
</html>