/// <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)); }