2010-12-02 6 views
0

Je développe une application Web utilisant asp.net mvc.Liste <T> sur le cache (opérations de sécurité)

J'ai une liste en cache (Liste de la classe de produit de mon modèle). Donc, je fais des opérations CRUD sur cette liste en cache. Je sais que HttpContext.Current.Cache est typeSafe mais la liste non. J'aimerais savoir, quelle est la meilleure façon de faire en sorte que mes opérations soient sûres pour éviter les conflits?

Mon code sont quelque chose comme ceci:

public static class ProjectCached { 
    const string key = "ProductList"; 
    // my cached list 
    public static IList<Product> Products { 
     get { 
      if (HttpContext.Current.Cache[key] == null) { 
       HttpContext.Current.Cache.Insert(key, /* get data from database */, ...); 
      } 
      return (List<Product>)HttpContext.Current.Cache[key]; 
     } 
    } 
    // my methods (operations on cached list) 
    public static void Increase(long id) { 
     var item = Products.FirstOrDefault(x => x.Id == id); 
     if (item != null) { 
      item.Prince += 1; 
      item.LastUpdate = DateTime.Now; 
     }  
    } 

    public static void Remove(long id) { 
     var item = Products.FirstOrDefault(x => x.Id == id); 
     if (item != null) { 
      Products.Remove(item); 
     }  
    } 
    // others methods 

}

Je vais avoir beaucoup d'utilisateurs d'écriture sur cette liste mise en cache en même temps ...

Je sais que je peut utiliser le mot clé "lock" mais où dois-je mettre cela? Sur mon objet trouvé? sur ma liste?

merci

+0

Pourquoi cachez-vous réellement ces objets en mémoire? Comment éviter toute perte de données lorsque l'AppDomain est déchargé (ou que votre ordinateur tombe en panne?). – Steven

Répondre

1

Pensez à utiliser IDictionary au lieu de la liste, par exemple SortedList<TKey, TValue>
À propos de SécuriJeunes-threading: Vous pouvez regarder à l'aide

  1. lock mot-clé

  2. ReaderWriterLockSlim - pour verrouiller uniquement lorsque nécessaire

  3. ConcurrentDictionary<TKey, TValue> - si le thread-safe implémenté dedans est suffisant pour vous.

UPD: ReaderWriterLockSlim est beaucoup plus avancé que le simple mot-clé lock. L'utilisation de ReaderWriterLockSlim permet à de nombreux lecteurs d'obtenir des données simultanément sans verrous. Mais quand un thread essaie d'écrire des données, tous les autres threads seront verrouillés et liront et écriront.

+0

Existe-t-il une différence entre le mot clé lock et ReaderWriterLockSlim? Merci mec! –

+0

Merci pour l'homme awser, j'étudierai la possibilité. Actuellement, mon projet est sur .Net 3.5, et je vais essayer de migrer vers 4.0. Merci encore! –

+0

@Felipe Toujours les bienvenus. BTW: Framework 4.0 est savoureux, vraiment. Migrez, vous ne regretterez pas. –

0

Vous devez le verrouiller avant de rechercher l'article.

private Object syncObject = new Object(); 

public static void Increase(long id) {   
    lock(syncObject) { 
     ...  
    } 
} 

public static void Remove(long id) {   
    lock(syncObject) { 
     ...  
    } 
} 
+0

Si je choisis d'utiliser le mot clé lock, dois-je l'utiliser quand le thread doit lire depuis le cache ou seulement écrire? Merci –

Questions connexes