Estoy tratando de implementar un método Cache genérico seguro para subprocesos, y me pregunto cómo debo implementar el bloqueo en él.¿Cómo puedo bloquear con la clave de caché?
Debe tener un aspecto algo como esto:
//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
}
¿Qué estás tratando de lograr? me parece que confundes 2 tipos de bloqueos: bloqueo para garantizar que solo un hilo pueda editar el objeto almacenado en caché y un bloqueo para garantizar que agregar/eliminar del caché sea seguro para los hilos. Agregar un bloqueo por objeto lo ayudará a asegurarse de que solo un hilo pueda cambiarlo, pero no tiene nada que ver con agregarlo/eliminarlo del caché (qué implementación no proporcionó, pero supongo que será algún tipo de diccionario). No creo que puedas descartar el caché, de todos modos, el bloqueo del nivel de recopilación. – YavgenyP
Estoy usando Asp.net caché ... así que no tengo que implementar mi propio diccionario ... Y estoy hablando de bloquear para agregar ... Digamos que 1000 personas solicitaron la página al mismo tiempo, quiero solo uno de ellos para almacenar en caché para objetar, y todos los demás para usarlo ... – Amir
aún necesita bloquear la colección subyacente, y no el objeto. lo que quiere hacer, si lo entiendo correctamente, es verificar si el objeto no está presente en esta colección, y solo luego agréguelo. Si está utilizando .net 4, puede usar una de sus nuevas colecciones de bloqueo, como ConcurrentDictionary para asegurarse de que cada clave se agregue solo una vez. – YavgenyP