2009-10-22 8 views
2

J'ai un cache statique qui, à une heure donnée, met à jour une liste générique d'objets à partir d'une base de données.Erreur de cache statique

Il est une simple liste statique:

private static List<myObject> _myObject; 

public List<myObject> FillMyObject() 
{ 
    if(_myObject == null || myTimer) 
     _myObject = getfromDataBase(); 
} 

J'ai 2 méthodes pour mettre à jour mon objet appelé UpdateMyObject et RemoveAnEntryFromMyObject.

Tout semble fonctionner correctement mais tout le monde une fois et un moment, je reçois beaucoup d'erreurs. Ensuite, il s'en va et semble bien à nouveau. Est-ce que quelqu'un sait ce qu'il se passe?

+1

Quel genre d'erreurs? Cela ressemble à un problème de synchronisation, mais vous ne nous avez pas donné suffisamment d'informations pour continuer. Utilisez-vous ceci dans un contexte multithread (c'est-à-dire, une application web)? –

+0

Oui, une application Web utilisant .net 2.0 –

Répondre

3

Vous devez utiliser l'instruction lock chaque fois que vous accédez ou mettez à jour votre cache statique. L'instruction lock bloquera l'exécution des autres threads jusqu'à ce qu'elle soit terminée. Si vous ne le faites pas, vous pourriez avoir un thread essayant de faire une boucle dans la collection en même temps qu'un autre thread enlève une ligne. Selon votre scénario exact, vous pouvez utiliser double check locking.

static readonly object lockObj = new object(); 
    private static List<myObject> _myObject; 

    public List<myObject> FillMyObject() 
    { 
     lock (lockObj) 
     { 
      if(_myObject == null || myTimer) 
       _myObject = getfromDataBase(); 
     } 
    } 


    public List<myObject> UpdateMyObject(somevalue) 
    { 
     lock (lockObj) 
     { 
      _myObject.RemoveAll(delegate(myObject o) 
           { 
            return o.somevalue == somevalue; 
           });) 
     } 
    } 

Further Reading

+0

Merci d'avoir lu quelque part à ce sujet? –

+0

Veuillez vous reporter à "Autres lectures" – cgreeno

+0

Voir aussi http://msdn.microsoft.com/fr-fr/library/ms173179.aspx – TrueWill

Questions connexes