Exemple #1
0
        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);
            }
        }
Exemple #2
0
 public void Add(TValue value)
 {
     _nodeTracker.Add(value);
 }