Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        /// <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));
                }
            }
        }
Example #6
0
        /// <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);
                }
            }
        }
Example #7
0
        /// <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);
            }
        }
Example #8
0
        /// <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);
            }
        }
Example #9
0
        /// <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();
                }
            }
        }
Example #10
0
 public WeakReferenceObject(WeakReferenceObject obj)
 {
     RequestTimes    = obj.RequestTimes;
     CreateTime      = obj.CreateTime;
     LastRequestTime = obj.LastRequestTime;
 }