Я новичок в С# и пытаюсь понять, как работать с Lazy
.
Мне нужно обработать параллельный запрос, ожидая результат уже запущенной операции. Запросы на данные могут поступать одновременно с одинаковыми/разными учетными данными.
Для каждого уникального набора учетных данных может быть не более одного входящего вызова GetDataInternal, при этом результат этого одного вызова возвращается всем официантам в очереди, когда он готов
private readonly ConcurrentDictionary<Credential, Lazy<Data>> Cache
= new ConcurrentDictionary<Credential, Lazy<Data>>();
public Data GetData(Credential credential)
{
// This instance will be thrown away if a cached
// value with our "credential" key already exists.
Lazy<Data> newLazy = new Lazy<Data>(
() => GetDataInternal(credential),
LazyThreadSafetyMode.ExecutionAndPublication
);
Lazy<Data> lazy = Cache.GetOrAdd(credential, newLazy);
bool added = ReferenceEquals(newLazy, lazy); // If true, we won the race.
Data data;
try
{
// Wait for the GetDataInternal call to complete.
data = lazy.Value;
}
finally
{
// Only the thread which created the cache value
// is allowed to remove it, to prevent races.
if (added) {
Cache.TryRemove(credential, out lazy);
}
}
return data;
}
Правильно ли это использовать Lazy
или мой код небезопасен?
Update:
Можно ли начать использовать MemoryCache
вместо ConcurrentDictionary
? Если да, то как создать значение ключа, потому что оно string
внутри MemoryCache.Default.AddOrGetExisting()