Me gustaría usar la clase .NET
de Lazy<T>
para implementar el almacenamiento en caché seguro de subprocesos. Supongamos que tenemos la siguiente configuración:Puede (¿debería?) Lazy <T> ser utilizado como una técnica de almacenamiento en caché?
class Foo
{
Lazy<string> cachedAttribute;
Foo()
{
invalidateCache();
}
string initCache()
{
string returnVal = "";
//CALCULATE RETURNVAL HERE
return returnVal;
}
public String CachedAttr
{
get
{
return cachedAttribute.Value;
}
}
void invalidateCache()
{
cachedAttribute = new Lazy<string>(initCache, true);
}
}
Mis preguntas son:
- Que este trabajo en absoluto?
- ¿Cómo funcionaría el bloqueo?
Siento que me falta un candado en algún lugar cerca del invalidateCache, pero por mi vida no puedo entender de qué se trata.
Estoy seguro de que hay un problema con esto en alguna parte, simplemente no he resuelto dónde.
[EDIT]
Ok, así que parece que tenía razón, había cosas que no había pensado. Si un hilo ve un caché obsoleto sería algo muy malo, por lo que parece que "Lazy" no es lo suficientemente seguro. Sin embargo, se accede a la propiedad mucho, por lo que estaba realizando una optimización pre-madura con la esperanza de poder aprender algo y tener un patrón para utilizar en el futuro para el almacenamiento en caché seguro para subprocesos. Seguiré trabajando en eso.
P.S .: Decidí hacer que el objeto thread-un-safe y tener acceso al objeto se controlara cuidadosamente en su lugar.
Sí, los valores invalidados no son buenos en esta situación (al menos no valores arbitrariamente largos). Gracias. – Crisfole