Пример #1
0
        private bool TryCreateSetup(TKey key, out ConstructionState state)
        {
            if (Storage.ContainsKey(key))
            {
                state = null;
                return(false);
            }

            state = new ConstructionState();
            if (States.TryAdd(key, state))
            {
                if (Storage.ContainsKey(key))
                {
                    TryCreateTeardown(key, state);
                    return(false);
                }

                return(true);
            }
            else
            {
                state.Dispose();
                return(false);
            }
        }
Пример #2
0
 private void TryCreateTeardown(TKey key, ConstructionState state)
 {
     if (States.TryRemove(key, out state))
     {
         state.Set();
         state.Dispose();
     }
 }
Пример #3
0
        public bool TryCreate(TKey key, Func <TValue> creator)
        {
            ConstructionState state;

            if (Storage.ContainsKey(key))
            {
                return(false);
            }

            state = new ConstructionState();
            if (States.TryAdd(key, state))
            {
                try {
                    if (Storage.ContainsKey(key))
                    {
                        return(false);
                    }

                    var result = creator();

                    if (!Storage.TryAdd(key, result))
                    {
                        throw new InvalidOperationException("Cache entry was created by someone else while construction lock was held");
                    }

                    return(true);
                } finally {
                    States.TryRemove(key, out state);
                    state.Set();
                    state.Dispose();
                }
            }
            else
            {
                state.Dispose();
            }

            return(false);
        }