【发布时间】:2019-10-18 11:40:49
【问题描述】:
我想看看下面的代码在健壮代码和干净代码方面是否有更好的方法。
// Encryption is singleton via IoC
public class Encryption{
private volatile ConcurrentDictionary<string, string> _blobs = new ConcurrentDictionary<string, string>();
private object _encryptedDataLock = new object();
public string CreateEncryptedData(string key)
{
string encryptedData = string.Empty;
if (_cloudBlobs.ContainsKey(key))
encryptedData = _blobs[key];
lock (_encryptedDataLock)
{
if (!_cloudBlobs.ContainsKey(key))
{
encryptedData = CalulateEncryptedData();
_blobs.TryAdd(key, encryptedData);
return encryptedData;
}
}
return encryptedData;
}
}
更新
我正在寻找不使用锁定对象、双重检查、易失性、尽可能少的代码的解决方案。
【问题讨论】:
-
_blobs不需要是易失的,因为它从未被写入。你也可以readonly。 -
但它有
_blobs.TryAdd -
没关系。这不是 volatile 的工作原理
-
好的,您能否详细说明或提供链接以便我完全理解?提前致谢。
-
阅读:albahari.com/threading。您永远不会分配给
_blobs字段。
标签: c# asp.net .net asp.net-core .net-core