2009-10-01 71 views
0

我不得不將數據集存儲在緩存中,以便X min,並且當它到期時,我擁有它,以便下一個請求將檢查緩存是否存在,然後進入並提取更新數據並設置緩存。問題在於另一個用戶此時會進來並嘗試訪問該對象並導致異常被拋出。我如何防止這種情況發生?C#問題,試圖訪問緩存對象的多個用戶

+0

請張貼破解的代碼。 – 2009-10-01 03:20:14

回答

3

您可以使用C#中的鎖定語句來執行此操作。

您需要一個用作「鎖定」的對象變量,因此一次只能有一個線程訪問它。

鎖定更新或檢索緩存對象的代碼。

下面是一個簡單的類演示此:

public class UpdateCache 
{ 
    private static object _myLockObject; 

    public static void UpdateCache() 
    { 
    lock(_myLockObject) 
    { 
     .. Update cache object 
    } 
    } 

    public static void LoadFromCache(string key) 
    { 
    lock(_myLockObject) 
    { 
     .. retrieve data from cache 
    } 

    } 
} 
1

一種典型的花紋是封裝緩存的對象中的屬性。屬性getter可以控制對緩存對象的所有訪問。

private static object _locker = new object(); 

public static DataSet CachedDataSet 
{ 
    get 
    { 
     if (Cache["DataSetKey"] == null) 
     { 
      lock (_locker) 
      { 
       if (Cache["DataSetKey"] == null) 
       { 
        Cache["DataSetKey"] = CreateAndFillDataSet(); 
       } 
      } 
     } 
     return (DataSet) Cache["DataSetKey"]; 
    } 
} 
+0

這段代碼不會編譯,getter沒有任何回報。 – 2009-10-01 03:33:43

+1

downvote(不是我的)雖然有點苛刻,顯然有點過分 – 2009-10-01 03:34:35

+0

等待私人對象不應該是靜態的嗎? – BlackTea 2009-10-01 03:37:06