Frage

Ich habe eine statische Cache, der eine generische Liste von Objekten aus einer Datenbank zu einem bestimmten Zeitpunkt aktualisiert.

Es ist nur eine einfache statische Liste:

private static List<myObject> _myObject;

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

Ich habe 2 Methoden mein Objekt namens UpdateMyObject und RemoveAnEntryFromMyObject zu aktualisieren.

Alles scheint in Ordnung, aber jeden einmal zu laufen und ein, während ich eine Masse Menge von Fehlern zu bekommen. Dann geht es weg und scheint wieder in Ordnung. Wer weiß, was los ist?

War es hilfreich?

Lösung

Sie müssen die sperren Anweisung, wenn Sie Ihre statischen Cache zugreifen oder zu aktualisieren. Die lock-Anweisung blockiert andere Threads von der Ausführung, bis es fertig ist. Wenn Sie dies nicht tun, könnten Sie einen roten Faden durch die Kollektion in einer Schleife zur gleichen Zeit versucht haben, wie ein anderer Thread eine Zeile zu entfernen. Je nach Ihnen genaue Szenario möchten Sie vielleicht überprüfen verwenden Sperren .

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

Lesen Weitere

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top