學習和分享一點簡單的System.Web.HttpRuntime.Cache的使用經驗

icon

配置文件

配置文件

<appSettings>
  
<add key="EnableCache" value="true"/>
  
<add key="CacheDurationSeconds" value="300"/>
</appSettings>

操作方法

 

代碼
using System;
using System.Web.Configuration;

public class SiteHelper
{
    
static public object GetCache(string CacheId)
    {
        
object objCache = System.Web.HttpRuntime.Cache.Get(CacheId);

        
// 判斷 Cache 是否啓用
        if (WebConfigurationManager.AppSettings["EnableCache"== null
            
|| !Convert.ToBoolean(WebConfigurationManager.AppSettings["EnableCache"]))
        {
            objCache 
= null;
            System.Web.HttpRuntime.Cache.Remove(CacheId);
        }

        
return objCache;
    }

    
/// <summary>
    
/// 寫入 Cache 資料 ( 預設 60 秒 )
    
/// </summary>
    
/// <param name="CacheId"></param>
    
/// <param name="objCache"></param>
    static public void SetCache(string CacheId, object objCache)
    {
        
if (WebConfigurationManager.AppSettings["CacheDurationSeconds"!= null)
        {
            SetCache(CacheId, objCache, 
                Convert.ToInt32(WebConfigurationManager.AppSettings[
"CacheDurationSeconds"]));
        }
        
else
        {
            SetCache(CacheId, objCache, 
60);
        }
    }

    
static public void SetCache(string CacheId, object objCache, int cacheDurationSeconds)
    {
        
if (objCache != null)
        {
            System.Web.HttpRuntime.Cache.Insert(
                CacheId,
                objCache,
                
null,
                System.Web.Caching.Cache.NoAbsoluteExpiration,
                
new TimeSpan(00, cacheDurationSeconds),
                System.Web.Caching.CacheItemPriority.High,
                
null);
        }
    }
}

使用方法

代碼
string strCache1 = SiteHelper.GetCache("Cache1"as string;

if (strCache1 == null)
{
    Response.Write(
"<p>Cache is empty</p>");

    strCache1 
= "OK";
    SiteHelper.SetCache(
"Cache1", strCache1, 30);
}

Response.Write(strCache1);

 常見問題#Cache顯示與清空問題

代碼
List<string> cacheKeys = new List<string>();
IDictionaryEnumerator cacheEnum 
= Cache.GetEnumerator();
while (cacheEnum.MoveNext())
{
    cacheKeys.Add(cacheEnum.Key.ToString());
}
foreach (string cacheKey in cacheKeys)
{
    Cache.Remove(cacheKey);
}
代碼
    //清除所有緩存
    protected void RemoveAllCache()
    {
        System.Web.Caching.Cache _cache 
= HttpRuntime.Cache;
        IDictionaryEnumerator CacheEnum 
= _cache.GetEnumerator();
        ArrayList al 
= new ArrayList();
        
while (CacheEnum.MoveNext())
        {
            al.Add(CacheEnum.Key);
        }
        
foreach (string key in al)
        {
            _cache.Remove(key);
        }
        show();
    }
    
//顯示所有緩存 
    void show()
    {
        
string str = "";
        IDictionaryEnumerator CacheEnum 
= HttpRuntime.Cache.GetEnumerator();

        
while (CacheEnum.MoveNext())
        {
            str 
+= "緩存名<b>[" + CacheEnum.Key + "]</b><br />";
        }
        
this.Label1.Text = "當前網站總緩存數:" + HttpRuntime.Cache.Count + "<br />" + str;
    }

添加到擴展方法

代碼
using System;
using System.Web.Caching;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// 擴充 System.Web.Caching 命名空間的 Extension Methods
/// </summary>
static public class CacheExtensionMethod
{
    
public static void Clear(this Cache x)
    {
        List
<string> cacheKeys = new List<string>();
        IDictionaryEnumerator cacheEnum 
= x.GetEnumerator();
        
while (cacheEnum.MoveNext())
        {
            cacheKeys.Add(cacheEnum.Key.ToString());
        }
        
foreach (string cacheKey in cacheKeys)
        {
            x.Remove(cacheKey);
        }
    }
}

MSDN

C# 語言的 foreach 語句(在 Visual Basic 中爲for each)隱藏了枚舉數的複雜性。因此,建議使用 foreach,而不直接操作枚舉數。

枚舉數可用於讀取集合中的數據,但不能用於修改基礎集合。

最初,枚舉數定位在集合中第一個元素前。Reset 方法還會將枚舉數返回到此位置。在此位置,調用Current 屬性會引發異常。因此,在讀取Current 的值之前,必須調用MoveNext 方法將枚舉數提前到集合的第一個元素。

在調用 MoveNextReset 之前,Current 返回同一個對象。MoveNextCurrent 設置爲下一個元素。

如果 MoveNext 越過集合的末尾,則枚舉數將放置在集合中最後一個元素的後面,而且MoveNext 返回false。當枚舉數位於此位置時,對 MoveNext 的後續調用也返回 false。如果最後一次調用 MoveNext 返回 false,則調用 Current 會引發異常。若要再次將 Current 設置爲集合的第一個元素,可以調用Reset,然後再調用MoveNext

只要該集合保持不變,枚舉數也就保持有效。如果對集合進行了更改(如添加、修改或刪除元素),則枚舉數將失效且不可恢復,並且下一次對 MoveNextReset 的調用將引發InvalidOperationException。如果在MoveNextCurrent 之間修改集合,那麼即使枚舉數已經無效,Current 也將返回它所設置成的元素。

枚舉數沒有對集合的獨佔訪問權;因此,從頭到尾對一個集合進行枚舉在本質上不是一個線程安全的過程。即使某個集合已同步,其他線程仍可以修改該集合,這會導致枚舉數引發異常。若要在枚舉過程中保證線程安全,可以在整個枚舉過程中鎖定集合,或者捕捉由於其他線程進行的更改而引發的異常。

給朋友家的店做個宣傳(東北口味):溝幫子燻雞 溝幫子云杉燻雞 溝幫子郝雲杉燻雞
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章