/// <summary> /// 读取数据,并且替换合集对应资源; /// </summary> private T InternalReplace <T>(string key, WeakReferenceObject old, Func <T> loader) where T : class { T asset = loader.Invoke(); var weakReferenceObject = new WeakReferenceObject <T>(asset, old); using (objectCollectionLock.WriteLock()) { objectCollection[key] = weakReferenceObject; } return(asset); }
/// <summary> /// 读取数据,并且将它加入到资源合集; /// </summary> private T InternalAdd <T>(string key, Func <T> loader) where T : class { T asset = loader.Invoke(); var weakReferenceObject = new WeakReferenceObject <T>(asset); using (objectCollectionLock.WriteLock()) { objectCollection.Add(key, weakReferenceObject); } return(asset); }
/// <summary> /// 确认是否存在该资源,若资源类型不同 或 已经被回收 都返回 false; /// </summary> public bool Contains <T>(string key) where T : class { ThrowIfKeyInconformity <T>(key); using (objectCollectionLock.ReadLock()) { WeakReferenceObject obj; if (objectCollection.TryGetValue(key, out obj)) { WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>; if (weakReferenceObject != null) { return(weakReferenceObject.IsAlive()); } } return(false); } }
/// <summary> /// 尝试获取到对应资源; /// </summary> public bool TryGet <T>(string key, out T value) where T : class { ThrowIfKeyInconformity <T>(key); using (objectCollectionLock.ReadLock()) { WeakReferenceObject obj; if (objectCollection.TryGetValue(key, out obj)) { WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>; if (weakReferenceObject != null) { return(weakReferenceObject.TryGetTarget(out value)); } } value = default(T); return(false); } }
/// <summary> /// 读取到资源,若已经存在则直接返回; /// </summary> public T Load <T>(string key, Func <T> loader) where T : class { ThrowIfKeyInconformity <T>(key); if (loader == null) { throw new ArgumentNullException(nameof(loader)); } using (objectCollectionLock.UpgradeableReadLock()) { WeakReferenceObject obj; if (objectCollection.TryGetValue(key, out obj)) { WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>; if (weakReferenceObject == null) { throw InvalidType <T>(key); } else { T asset; if (weakReferenceObject.TryGetTarget(out asset)) { return(asset); } else { return(InternalReplace(key, obj, loader)); } } } else { return(InternalAdd(key, loader)); } } }
/// <summary> /// 添加或更新合集内容; /// </summary> public AddOrUpdateStatus AddOrUpdate <T>(string key, WeakReferenceObject <T> value) where T : class { ThrowIfKeyInconformity <T>(key); if (value == null) { throw new ArgumentNullException(nameof(value)); } using (objectCollectionLock.WriteLock()) { if (objectCollection.ContainsKey(key)) { objectCollection[key] = value; return(AddOrUpdateStatus.Updated); } else { objectCollection.Add(key, value); return(AddOrUpdateStatus.Added); } } }
/// <summary> /// 尝试获取到对应类型资源,若key类型不对应则抛出异常; /// </summary> private bool InternalTryGet <T>(string key, out WeakReferenceObject <T> weakReferenceObject) where T : class { WeakReferenceObject obj; if (objectCollection.TryGetValue(key, out obj)) { weakReferenceObject = obj as WeakReferenceObject <T>; if (weakReferenceObject == null) { throw InvalidType <T>(key); } else { return(true); } } else { weakReferenceObject = null; return(false); } }
/// <summary> /// 获取到对应资源,若不存在则返回异常; /// </summary> public T Get <T>(string key) where T : class { ThrowIfKeyInconformity <T>(key); using (objectCollectionLock.ReadLock()) { WeakReferenceObject obj; if (objectCollection.TryGetValue(key, out obj)) { WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>; if (weakReferenceObject != null) { T asset; if (weakReferenceObject.TryGetTarget(out asset)) { return(asset); } } } throw new KeyNotFoundException(key); } }
/// <summary> /// 添加内容到合集; /// </summary> public void Add <T>(string key, WeakReferenceObject <T> value) where T : class { ThrowIfKeyInconformity <T>(key); if (value == null) { throw new ArgumentNullException(nameof(value)); } using (objectCollectionLock.UpgradeableReadLock()) { if (objectCollection.ContainsKey(key)) { using (objectCollectionLock.WriteLock()) { objectCollection.Add(key, value); } } else { throw new ArgumentException(); } } }
public WeakReferenceObject(WeakReferenceObject obj) { RequestTimes = obj.RequestTimes; CreateTime = obj.CreateTime; LastRequestTime = obj.LastRequestTime; }