Sie müssen die Datumzeit speichern, wenn sie im Cache gespeichert wurde. Auf diese Weise können Sie das Element testen, wenn es abgelaufen ist. Wenn der Artikel nicht gefunden oder abgelaufen ist? Rufen Sie die resolvefunction dafür auf.
Hier ist ein Beispiel für einen Cache, der es selbst Funktion durch den Aufruf einer Rückruf füllen kann:
public class MyCache<TKey, TValue>
{
// type to store datetime and a value
private struct CacheItem
{
public DateTime RetreivedTime;
public TValue Value;
}
// the dictionary
private Dictionary<TKey, CacheItem> _cache = new Dictionary<TKey, CacheItem>();
private TimeSpan _timeout;
private Func<TKey, TValue> _resolveFunc;
public MyCache(TimeSpan timeout, Func<TKey, TValue> resolveFunc)
{
// store to fields
_timeout = timeout;
_resolveFunc = resolveFunc;
}
public TValue this[TKey key]
{
get
{
CacheItem valueWithDateTime;
// if nothing is found, you should resolve it by default
var getNewValue = true;
// lookup the key
if (_cache.TryGetValue(key, out valueWithDateTime))
// test if the value RetreivedTime was expired?
getNewValue = valueWithDateTime.RetreivedTime.Add(_timeout) > DateTime.UtcNow;
// was it found? or expired?
if (getNewValue)
{
valueWithDateTime = new CacheItem { RetreivedTime = DateTime.UtcNow, Value = _resolveFunc(key) };
_cache[key] = valueWithDateTime;
}
// return the value
return valueWithDateTime.Value;
}
}
// the cleanup method, you should call it sometimes...
public void Cleanup()
{
var currentDateTime = DateTime.UtcNow;
// ToArray prevents modifying an iterated collection.
foreach (var keyValue in _cache.ToArray())
if (keyValue.Value.RetreivedTime.Add(_timeout) < currentDateTime)
_cache.Remove(keyValue.Key);
}
}
Beispiel für das Caching von Text-Dateien:
class Program
{
static string RetreiveFileContent(string filename)
{
if(!File.Exists(filename))
return default(string);
return File.ReadAllText(filename);
}
static void Main(string[] args)
{
var textFileCache = new MyCache<string, string>(TimeSpan.FromMinutes(2), RetreiveFileContent);
var content = textFileCache["helloworld.txt"];
// sometimes you need to cleanup old data.
textFileCache.Cleanup();
}
}
Sie müssen einige Ausnahmebehandlung erstellen natürlich ....
Ich würde einen neuen Typ (CacheItem vielleicht?) erstellen und t machen Das Wörterbuch ein 'Dictionary >'. Der Typ "CacheItem " würde das "T" (was auch immer der Wert ist) und eine "DateTime" enthalten, die verfolgt, wann der Wert dem Cache hinzugefügt wurde. Dann können Sie einfach überprüfen, ob der zwischengespeicherte Wert noch gültig ist, bevor Sie ihn zurückgeben oder feststellen, ob er neu bewertet werden muss. –
itsme86
Warum nicht einen MemoryCache verwenden? Microsoft hat kürzlich den MemoryCache in einen Namespace verschoben, der das Gepäck nicht mehr enthält. https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx – mageos
Wie kann ich eine Datetime erstellen, um den zwischengespeicherten Wert zu verfolgen? –