Pregunta

Tengo un Caché estático que en un tiempo determinado actualiza una lista genérica de Objetos de una base de datos.

Es solo una simple lista estática:

private static List<myObject> _myObject;

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

Tengo 2 métodos para actualizar mi objeto llamado UpdateMyObject y RemoveAnEntryFromMyObject .

Todo parece funcionar bien, pero todos, de vez en cuando, obtengo una gran cantidad de errores. Luego se va y parece estar bien de nuevo. ¿Alguien sabe qué está pasando?

¿Fue útil?

Solución

Debe usar el bloqueo declaración cuando esté accediendo o actualizando su caché estático. La sentencia de bloqueo impedirá que otros subprocesos se ejecuten hasta que finalice. Si no haces esto, es posible que tengas un subproceso que intenta recorrer la colección al mismo tiempo que otro subproceso está eliminando una fila. Dependiendo de su situación exacta, es posible que desee utilizar bloqueo de doble comprobación .

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

Lecturas adicionales

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top