Если два потока вызывают CreateEncryptedData
с одним и тем же ключом в одно и то же время, возможны три результата:
CalulateEncryptedData()
вызывается ровно один раз, оба потока получают результат, и эторезультат сохраняется в _blobs
. CalulateEncryptedData()
вызывается дважды, но результат одного из вызовов отбрасывается. Оба потока получают один и тот же результат, и этот результат также сохраняется в _blobs
. CalulateEncryptedData()
вызывается дважды, и оба потока получают разные результаты. Один из результатов хранится в _blobs
. Очевидно, что это нежелательно.
Если вам нужен случай 1, то вам нужен отдельный объект блокировки, но вы можете написать его так:
public string CreateEncryptedData(string key)
{
if (_blobs.TryGetValue(key, out var value))
return value;
lock (_encryptedDataLock)
{
return _blobs.GetOrAdd(key, x => CalulateEncryptedData());
}
}
Если случай 2 в порядкеВы можете еще упростить до этого:
public string CreateEncryptedData(string key)
{
return _blobs.GetOrAdd(key, x => CalulateEncryptedData());
}