Exemplo n.º 1
0
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public valueType Get(keyType key)
        {
            if (isLog)
            {
                RandomKey <keyType> randomKey = key;
                KeyValue <valueType, EventWaitHandle> value;
TRYGET:
                Monitor.Enter(logLock);
                if (queue.TryGetValue(ref randomKey, out value))
                {
                    Monitor.Exit(logLock);
                    if (value.Value == null)
                    {
                        return(value.Key);
                    }
                    value.Value.WaitOne();
                    goto TRYGET;
                }
                try
                {
                    value.Value = new EventWaitHandle(false, EventResetMode.ManualReset);
                    queue.Set(ref randomKey, value);
                    if (queue.Count > maxCount)
                    {
                        queue.UnsafePopNode();
                    }
                }
                finally { Monitor.Exit(logLock); }
                try
                {
                    value.Key = getValue(key);
                }
                finally
                {
                    KeyValue <valueType, EventWaitHandle> cacheValue;
                    Monitor.Enter(logLock);
                    if (queue.TryGetOnly(key, out cacheValue) && cacheValue.Value == value.Value)
                    {
                        try
                        {
                            queue.SetOnly(key, new KeyValue <valueType, EventWaitHandle>(value.Key, null));
                        }
                        finally { Monitor.Exit(logLock); }
                    }
                    else
                    {
                        Monitor.Exit(logLock);
                    }
                    value.Value.Set();
                }
                return(value.Key);
            }
            return(getValue(key));
        }