2009-10-01 3 views
0

Je dois stocker un ensemble de données en cache pour X min et quand il expire, je l'ai pour que la prochaine requête vérifie si le cache existe et puis va et récupère mettre à jour les données et définir le cache. Le problème est qu'un autre utilisateur entrera en ce moment et essaiera d'accéder à l'objet et provoquera une exception. Comment puis-je empêcher cela?Problème C# avec plusieurs utilisateurs tentant d'accéder à l'objet mis en cache

+0

Veuillez poster le code qui se casse. –

Répondre

3

Vous pouvez le faire en utilisant l'instruction lock en C#.

Vous avez besoin d'une variable d'objet utilisée comme "verrou" pour qu'un seul thread puisse y accéder à la fois.

Placez le verrou autour du code qui met à jour ou récupère l'objet de cache.

Voici une classe simple qui démontre ceci:

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

Un modèle typique est d'encapsuler l'objet mis en cache dans une propriété. La propriété getter peut alors contrôler tous les accès à l'objet mis en cache.

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

Ce code ne sera pas compilé, le getter n'a pas de retour. –

+1

le downvote (pas le mien) est un peu dur cependant, clairement un oversite –

+0

Attendez que l'objet privé ne soit pas statique aussi bien? – BlackTea

Questions connexes