2009-10-22 5 views
2

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

그것은 단순한 정적 목록입니다 :

private static List<myObject> _myObject; 

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

내 객체가 UpdateMyObjectRemoveAnEntryFromMyObject라는 업데이트하는 2 가지 방법이있다.

모든 것이 잘 돌아가는 것처럼 보이지만 모든 사람은 한 번씩 오류가 발생합니다. 그렇다면 그것은 사라지고 다시 잘 보인다. 아무도 무슨 일이 일어나고 있는지 알고 있습니까?

+1

오류의 종류는? 동기화 문제처럼 보이지만 계속 진행하기에 충분한 정보를 제공하지 않았습니다. 다중 스레드 환경 (즉, 웹 응용 프로그램)에서이 기능을 사용하고 있습니까? –

+0

예 .net 2.0을 사용하는 웹 앱 –

답변

3

정적 캐시에 액세스하거나 업데이트 할 때마다 lock 문을 사용해야합니다. lock 문은 완료 될 때까지 다른 스레드의 실행을 차단합니다. 이 작업을 수행하지 않으면 하나의 스레드가 다른 스레드가 행을 제거함과 동시에 컬렉션을 반복하려고 시도 할 수 있습니다. 정확한 시나리오에 따라 double check locking을 사용할 수 있습니다.

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

Further Reading

+0

고맙습니다 어디에서이 기사를 읽을 수 있습니까? –

+0

"추가 읽기"를 참조하십시오. – cgreeno

+0

http://msdn.microsoft.com/en-us/library/ms173179.aspx – TrueWill

관련 문제