Domanda

Ho una cache statica che a un certo momento aggiorna un elenco generico di oggetti da un database.

È solo un semplice elenco statico:

private static List<myObject> _myObject;

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

Ho 2 metodi per aggiornare il mio oggetto chiamato UpdateMyObject e RemoveAnEntryFromMyObject .

Sembra che tutto vada bene, ma ogni tanto ricevo una grande quantità di errori. Quindi scompare e sembra di nuovo a posto. Qualcuno sa cosa sta succedendo?

È stato utile?

Soluzione

Devi utilizzare il lock quando si accede o si aggiorna la cache statica. L'istruzione lock bloccherà l'esecuzione di altri thread fino al termine. In caso contrario, è possibile che un thread tenti di scorrere la raccolta contemporaneamente a un altro thread che rimuove una riga. A seconda del tuo esatto scenario potresti voler utilizzare doppio controllo del blocco .

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

Ulteriori letture

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top