Question

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

Ce n'est qu'une simple liste statique:

private static List<myObject> _myObject;

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

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

Tout semble bien se passer, mais tout le monde a de temps en temps des erreurs en masse. Ensuite, il s'en va et semble aller bien à nouveau. Est-ce que quelqu'un sait ce qu'il se passe?

Était-ce utile?

La solution

Vous devez utiliser le verrouiller déclaration chaque fois que vous accédez ou mettez à jour votre cache statique. L'instruction de verrouillage empêchera d'autres threads de s'exécuter jusqu'à la fin. Si vous ne le faites pas, il est possible qu'un thread tente de parcourir la collection en même temps qu'un autre thread supprime une ligne. Selon votre scénario, vous pouvez utiliser le le double contrôle du verrouillage .

    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;
                                 });)
         }
     }

Pour en savoir plus

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top