Pergunta

Eu tenho um cache estático que em um tempo definido actualiza uma lista genérica de objetos de um banco de dados.

É apenas uma lista estática simples:

private static List<myObject> _myObject;

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

Eu tenho 2 métodos para atualizar o meu objeto chamado UpdateMyObject e RemoveAnEntryFromMyObject.

Tudo parece correr bem, mas todos de vez em quando eu recebo uma quantidade maciça de erros. Em seguida, ele vai embora e parece muito bem novamente. Alguém sabe o que está acontecendo?

Foi útil?

Solução

Você precisa usar o bloqueio declaração sempre que você está acessando ou atualizar seu cache estática. A declaração de bloqueio irá bloquear outros tópicos de de executar até que esteja terminado. Se você não fizer isso, você pode ter um fio tentando loop através da coleção, ao mesmo tempo que outro thread está removendo uma linha. Dependendo você cenário exato que você pode querer usar dupla bloqueio cheque.

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

Leitura adicional

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top