¿Las siguientes suposiciones son válidas para este código? Puse información de fondo debajo del código, pero no creo que sea relevante.Creación de bloqueos dinámicos en tiempo de ejecución en ASP.NET
Supuesto 1: Dado que esta es una sola aplicación, supongo que será manejada por un único proceso. Por lo tanto, las variables estáticas se comparten entre subprocesos y declarar que mi colección de objetos de bloqueo estática es válida.
Supuesto 2: Si sé que el valor ya está en el diccionario, no es necesario que bloquee la lectura. Podría usar un ConcurrentDictionary, pero creo que este estará seguro ya que no estoy enumerando (o borrando), y el valor existirá y no cambiará cuando llamo al UnlockOnValue()
.
Suposición 3: Puedo bloquear la colección Keys, ya que esa referencia no cambiará, incluso si la estructura de datos subyacente sí lo hace.
private static Dictionary<String,Object> LockList =
new Dictionary<string,object>();
private void LockOnValue(String queryStringValue)
{
lock(LockList.Keys)
{
if(!LockList.Keys.Contains(queryStringValue))
{
LockList.Add(screenName,new Object());
}
System.Threading.Monitor.Enter(LockList[queryStringValue]);
}
}
private void UnlockOnValue(String queryStringValue)
{
System.Threading.Monitor.Exit(LockList[queryStringValue]);
}
Entonces me gustaría utilizar este código como:
LockOnValue(Request.QueryString["foo"])
//Check cache expiry
//if expired
//Load new values and cache them.
//else
//Load cached values
UnlockOnValue(Request.QueryString["foo"])
Antecedentes: Estoy creando una aplicación en ASP.NET que descarga datos basados en una sola variable definida por el usuario en la consulta cuerda. La cantidad de valores será bastante limitada. Necesito almacenar en caché los resultados para cada valor por un período de tiempo específico.
Approach: Decidí usar archivos locales para almacenar en caché los datos, lo cual no es la mejor opción, pero quería probarlo ya que no es crítico y el rendimiento no es un gran problema. Usé 2 archivos por opción, uno con la fecha de caducidad de la memoria caché y otro con los datos.
Problema: No estoy seguro de cuál es la mejor manera de hacer el bloqueo, y no estoy demasiado familiarizado con problemas de enhebrado en .NET (una de las razones por las que elegí este enfoque). De acuerdo con lo que está disponible, y lo que leo, pensé que lo anterior debería funcionar, pero no estoy seguro y quería una segunda opinión.
¿Cuál es el problema con el uso de 'HttpRuntime.Cache'? – scottm
Esa fue mi primera opción, pero estaba actuando de forma extraña. Puede ser porque mi página borra la respuesta y devuelve un archivo de texto, pero no profundicé demasiado después de encontrarme con problemas similares publicados en Internet, sin respuestas que funcionen para mí. Lo único que no entendí fue la configuración de IIS y si el almacenamiento en caché estaba configurado correctamente. Todavía puedo hacer eso más tarde, pero es un código no crítico y esto planteó preguntas a las que quería respuestas, incluso si no es la mejor arquitectura. – Kendrick
Estoy tratando de implementar una solución muy similar a la tuya en la que estoy almacenando los resultados de los métodos. También necesitaré una forma de crear diferentes bloqueos de caché y me preguntaba si su solución ha resistido la prueba del tiempo, aplausos. –