正在填充缓存时缓存和排队?

时间:2010-03-09 05:28:09

标签: c# linq caching dataset

什么是正确的方法来缓存一个对象(DataSet),然后得到它,当它到期时重新填充它,而不是应用程序中的一个主要打嗝......应用程序依赖于这些数据只是为了只读目的。 / p>

1 个答案:

答案 0 :(得分: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;
    }
}

显然,这只是伪代码,但你应该能够看到发生了什么:当缓存值到期时,我们启动一个新线程来获取新值,但是当该线程仍在工作时,我们继续提供旧的缓存值。

最后,当线程完成它的工作时,我们用新的缓存值替换旧的缓存值。