public async Task Can_exchange_value() { var safeLazy = new ThreadSafeLazyRef <string>(() => ""); var tasks = new List <Task>(); for (var i = 0; i < 10; i++) { tasks.Add(Task.Run(() => safeLazy.ExchangeValue(s => s + "s"))); } await Task.WhenAll(tasks); Assert.Equal("ssssssssss", safeLazy.Value); }
public virtual TValue GetOrAdd([NotNull] TKey key, [NotNull] Func <TKey, TValue> factory) { Check.NotNull(key, "key"); Check.NotNull(factory, "factory"); TValue value; if (!_cache.Value.TryGetValue(key, out value)) { var newValue = factory(key); _cache.ExchangeValue(d => d.ContainsKey(key) ? d : d.Add(key, newValue)); value = _cache.Value[key]; } return(value); }