2010-03-09 1 views
0

개체 (DataSet)를 캐시하고 올바른 시점에서 만료 될 때 응용 프로그램의 주요한 난점없이 다시 채워 넣을 올바른 방법은 무엇입니까? 응용 프로그램은이 데이터를 읽기 전용으로 사용합니다.캐싱 중에 캐싱 및 대기 중입니까?

답변

1

문제가 있다고 생각되면 실제로 다시 채우는 데 약간의 시간이 걸릴 수 있으며 약간 오래된 데이터에 대해 걱정하지 않으셔도됩니다. 분명히

class MyClass 
{ 
    private DataSet cached; 
    private Thread repopulateThread; 

    public DataSet GetDataSet() { 
     lock(this) { 
      if (/*cached has expired*/ && populateThread == null) { 
       populateThread = new Thread(PopulateCachedValue); 
       populateThread.Start(); 
      } 
      return cached; 
     } 
    } 

    private void PopulateCachedValue() { 
     DataSet ds = /* fetch new DataSet */ 
     lock(this) { 
      cached = ds; 
     } 
     populateThread = null; 
    } 
} 

, 이것은 단지 의사,하지만 당신은 무슨 일이 일어나고 있는지 볼 수 있어야합니다 :이 경우, 당신은 아마이 작업을 수행 할 수있는 캐시 값이 만료 될 때, 우리는을 가져 오기 위해 새로운 스레드를 회전 새로운 값을 반환하지만 해당 스레드가 계속 작동하는 동안에도 캐시 된 값인 을 계속 제공합니다.

마지막으로 스레드가 작업을 마쳤 으면 이전 캐시 값을 새 값으로 바꿉니다.