public Task <TValue> Get(TKey key, MissingValueFactory <TKey, TValue> missingValueFactory) { lock (_lock) { INode <TValue> existingNode; if (TryGetExistingNode(key, out existingNode)) { if (existingNode.HasValue) { _nodeTracker.Statistics.Hit(); return(existingNode.Value); } var pending = new PendingValue <TKey, TValue>(key, missingValueFactory); return(existingNode.GetValue(pending)); } if (missingValueFactory == null) { _nodeTracker.Statistics.Miss(); throw new KeyNotFoundException($"Key not found: {key}"); } var pendingValue = new PendingValue <TKey, TValue>(key, missingValueFactory); var nodeValueFactory = new NodeValueFactory <TValue>(pendingValue, 0); var node = new FactoryNode <TValue>(nodeValueFactory); _index[key] = new WeakReference <INode <TValue> >(node, false); _nodeTracker.Add(nodeValueFactory); return(pendingValue.Value); } }
public void Add(TValue value) { _nodeTracker.Add(value); }