문제

설정 시간에 데이터베이스의 일반 객체 목록을 업데이트하는 정적 캐시가 있습니다.

단순한 정적 목록 일뿐입니다.

private static List<myObject> _myObject;

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

호출 된 객체를 업데이트하는 두 가지 방법이 있습니다 UpdateMyObject 그리고 RemoveAnEntryFromMyObject.

모든 것이 잘 실행되는 것처럼 보이지만 모든 사람이 한 번은 대량의 오류를 얻습니다. 그런 다음 사라지고 다시 괜찮아 보입니다. 무슨 일이 일어나고 있는지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

당신은 그것을 사용해야합니다 자물쇠 정적 캐시에 액세스하거나 업데이트 할 때마다 명령합니다. 잠금 문은 다른 스레드가 실행에서 끝날 때까지 차단됩니다. 이 작업을 수행하지 않으면 다른 스레드가 행을 제거하는 것과 동시에 컬렉션을 루프하려고 시도하는 스레드가있을 수 있습니다. 사용하려는 정확한 시나리오에 따라 이중 점검 잠금.

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

추가 독서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top