Ich versuche, eine generische thread-sichere Cache-Methode zu implementieren, und ich frage mich, wie ich die Sperre darin implementieren sollte.Wie kann ich nach Cache-Schlüssel sperren?
Es sollte wie folgt aussehen:
//private static readonly lockObject = new Object();
public T GetCache<T>(string key, Func<T> valueFactory...)
{
// try to pull from cache here
lock (lockObject) // I don't want to use static object lock here because then every time a lock is performed, all cached objects in my site have to wait, regarding of the cache key.
{
// cache was empty before we got the lock, check again inside the lock
// cache is still empty, so retreive the value here
// store the value in the cache here
}
// return the cached value here
}
Was möchten Sie erreichen? Es scheint mir, dass Sie zwischen zwei Arten von Sperren verwirren: Sperren, um sicherzustellen, dass nur ein Thread das zwischengespeicherte Objekt bearbeiten kann und eine Sperre, um sicherzustellen, dass das Hinzufügen/Entfernen aus dem Cache threadsicher ist. Das Hinzufügen einer Sperre pro Objekt wird Ihnen helfen, sicherzustellen, dass nur ein Thread es ändern kann, aber es hat nichts damit zu tun, es aus dem Cache hinzuzufügen/zu entfernen (welche Implementierung Sie nicht zur Verfügung gestellt haben) Wörterbuch). Ich denke nicht, dass Sie die Cache - Sammel - Level - Sperre sowieso ablehnen können. – YavgenyP
Ich benutze Asp.net Cache ... also muss ich nicht mein eigenes Wörterbuch implementieren ... Und ich spreche über Locking für das Hinzufügen ... Sagen wir, 1000 Leute haben die Seite zur gleichen Zeit angefordert, ich will nur eine von ihnen zu cachen, um Objekt, und alle anderen, um es zu verwenden ... – Amir
Sie müssen immer noch die zugrunde liegende Sammlung und nicht das Objekt sperren. Was Sie tun wollen, wenn ich es richtig verstehe, ist zu prüfen, ob das Objekt in dieser Sammlung nicht vorhanden ist, und erst dann hinzuzufügen. Wenn Sie .net 4 verwenden, können Sie eine ihrer neuen Blockierungssammlungen verwenden, z. B. ConcurrentDictionary, um sicherzustellen, dass jeder Schlüssel nur einmal hinzugefügt wird. – YavgenyP