Creación de bloqueos dinámicos en tiempo de ejecución en ASP.NET

¿Son válidas las siguientes suposiciones para este código? Pongo información de fondo debajo del código, pero no creo que sea relevante.

Supuesto 1: Como se trata de una aplicación única, asumo que se manejará mediante un solo proceso. Por lo tanto, las variables estáticas se comparten entre subprocesos y la declaración de mi colección de objetos de bloqueo estáticamente es válida.

Suposición 2: Si sé que el valor ya está en el diccionario, no necesito bloquear en lectura. Podría usar un ConcurrentDictionary, pero creo que este será seguro ya que no estoy enumerando (o eliminando), y el valor existirá y no cambiará cuando llameUnlockOnValue().

Suposición 3: Puedo bloquear la colección de claves, 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 usaría 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"])

Fondo: Estoy creando una aplicación en ASP.NET que descarga datos basados ​​en una única variable definida por el usuario en la cadena de consulta. El número de valores será bastante limitado. Necesito almacenar en caché los resultados de cada valor durante un período de tiempo específico.

Enfoque: Decidí usar archivos locales para almacenar en caché los datos, que no es la mejor opción, pero quería intentarlo ya que esto no es crítico y el rendimiento no es un gran problema. Utilicé 2 archivos por opción, uno con la fecha de caducidad del 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 los problemas de subprocesamiento en .NET (una de las razones por las que elegí este enfoque). Según lo que está disponible y lo que leí, pensé que lo anterior debería funcionar, pero no estoy seguro y quería una segunda opinión.

Respuestas a la pregunta(2)

Su respuesta a la pregunta