2011-01-27 20 views
10

Si prega di verificare il codice qui sotto:HttpContext.Current.Cache è thread-safe?

objDDLTable = HttpContext.Current.Cache["TestSet"] as Hashtable; 

if (objDDLTable == null) 
{ 
    objDDLTable = new Hashtable(); 
    arrDDLItems = GetDropDownList("testDropDown"); 
    objDDLTable.Add("testDropDown", arrDDLItems); 
    HttpContext.Current.Cache["TestSet"] = objDDLTable; 
} 
else if (objDDLTable != null && !objDDLTable.Contains("testDropDown")) 
{ 
    arrDDLItems = GetDropDownList("testDropDown"); 
    objDDLTable.Add("testDropDown", arrDDLItems); 
    HttpContext.Current.Cache["TestSet"] = objDDLTable; 
} 
else 
{ 
    arrDDLItems = objDDLTable["testDropDown"] as DdlItem[]; 
} 

Il codice, come si può dedurre, è sostanzialmente quella di memorizzare nella cache alcuni valori per un elenco a discesa in una pagina web.

In primo luogo, tenta di leggere un oggetto HashTable dalla cache, quindi controlla se la chiave specifica esiste nell'oggetto HashTable letto dalla cache. Se lo fa, viene letto il valore (array di elementi), altrimenti legge la matrice dall'origine e aggiunge una nuova chiave nella HashTable, che viene quindi memorizzata nella cache per l'utilizzo successivo.

Questo funziona bene nella maggior parte dei casi, tuttavia, abbiamo ottenuto il seguente errore occassionally:

System.ArgumentException: Item has already been added. 
Key in dictionary: 'testDropDown' Key being added: 'testDropDown' at 
System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) at 
System.Collections.Hashtable.Add(Object key, Object value) 

Logicamente, non dovrebbe mai essere un caso in cui il sistema sta cercando di aggiungere la chiave testDropDown nella HashTable quando è già presente, la prima condizione non dovrebbe permetterlo.

L'unica cosa che mi viene in mente è la possibilità di un altro thread aggiungendo la chiave all'HashTable in un momento in cui il controllo delle condizioni non è riuscito sul primo thread e tenta anche di aggiungere la chiave.

A mia conoscenza, Cache è un oggetto statico thread-safe, ma non riesco a pensare a qualcos'altro che causa quell'errore. Ragazzi, per favore aiutatemi a identificare la causa qui?

risposta

20

L'oggetto HttpContext.Current.Cache è thread-safe, il che significa che l'archiviazione e la lettura da esso sono thread-safe, ma ovviamente gli oggetti archiviati all'interno potrebbero non essere thread-safe. Nel tuo caso stai memorizzando un Hashtable che non è un oggetto thread-safe, il che significa che questa istanza potrebbe potenzialmente essere condivisa tra più thread e potrebbero esserci letture e scritture contemporanee all'hashtable e questo potrebbe causare problemi.

+1

In particolare, in questo caso l'Hashtable che si sta aggiungendo non è thread-safe, ma soprattutto più thread possono accedere al middle se block contemporaneamente. –

Problemi correlati