¿Cómo realizar la función de memoización segura de subprocesos en c #?

Aquí en la pila desbordamiento heencontró El código que memoriza las funciones de un solo argumento:

static Func<A, R> Memoize<A, R>(this Func<A, R> f)
{
    var d = new Dictionary<A, R>();
    return a=> 
    {
        R r;
        if (!d.TryGetValue(a, out r))
        {
            r = f(a);
            d.Add(a, r);
        }
        return r;
    };
}

Si bien este código hace su trabajo por mí, a veces falla cuando se llama simultáneamente a la función memorizada desde los múltiples hilos:Add El método se llama dos veces con el mismo argumento y lanza una excepción.

¿Cómo puedo hacer que la memoria sea segura para el hilo?

Respuestas a la pregunta(3)

Su respuesta a la pregunta