Здесь, при переполнении стека, я нашел код, который memoizes функции с одним аргументом:
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;
};
}
Хотя этот код выполняет свою работу для меня, он иногда не работает, когда memoized функция вызывается из нескольких потоков одновременно: метод Add
вызывается дважды с тем же аргументом и выдает исключение.
Как я могу сделать memoization потокобезопасным?