这里的堆栈溢出我已经found是memoizes单参数的函数代码:如何在c#中执行线程安全的函数memoization?
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
方法被相同的参数调用两次并抛出异常。
我怎样才能让记忆化线程安全的?
请注意,'GetOrAdd'不会完全阻止f被一次给定的参数调用;它只保证只有一个调用的结果被添加到字典中。在线程在添加缓存值之前同时检查缓存的情况下,您可以获得多个调用。这通常不值得担心,但是如果调用具有不需要的副作用,我会提及它。 –
@JamesWorld是的,没错。编辑答案反映,谢谢! – Gman
我有点困惑 - 这里不是'缓存'一个局部变量吗?每次调用ThreadsafeMemoize()时,它不会创建一个新的字典吗? – dashnick