2010-03-09 4 views

Répondre

1

Je suppose que votre problème est que le repeuplement peut prendre du temps et que vous ne vous inquiétez pas vraiment des données légèrement obsolètes. Dans ce cas, vous pouvez probablement le faire:

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

De toute évidence, cela est juste pseudocode, mais vous devriez être en mesure de voir ce qui se passe: lorsque la valeur mise en cache expire, on tourne un nouveau fil pour aller chercher la nouvelle valeur, mais pendant que ce thread fonctionne toujours, nous continuons à servir la ancienne valeur mise en cache.

Enfin, lorsque le thread a terminé son travail, nous remplaçons l'ancienne valeur en cache par la nouvelle.