ConcurrentDictionary TryAdd与Item setter性能

Hen*_*Kok 0 c#

我们在一个高流量的网站上,我们想要使用ConcurrentDictionary进行一些非常简单的缓存计算,以防止它为每个请求完成.可能的输入数量足够有限,计算相对较重(拆分和重新连接字符串).

我正在考虑代码

string result;
if (!MyConCurrentDictionary.TryGetValue(someKey, out result))
{
    result = DoCalculation(someKey);
    // alternative 1: use Item property
    MyConcurrentDictionary[someKey] = result;
    //alternative 2: use TryAdd
    MyConcurrentDictionary.TryAdd(someKey, result);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:从绩效角度来看,哪种替代方案是最佳选择?

SLa*_*aks 8

你的代码完全坏了; 你假设这两行之间什么都不会改变.

你需要使用.GetOrAdd().

通常,在处理可变并发对象时,必须永远不要对对象进行多次调用,因为它的状态可以随时更改.

  • @HenkKok:"无条件执行"是什么意思?只有当你正在做的时候才会评估代表是否已经在字典中.我们正在谈论[重载接受一个`Func <Tkey,Tvalue>`委托](https://msdn.microsoft.com/en-us/library/ee378677(v = vs.110).aspx).关于原子性,不能保证代理不会被多次调用(就像在代码中一样),但它保证返回值对于所有线程始终是相同的实例. (3认同)