コード例 #1
0
        internal static DynamicProxy Get(Type type)
        {
            DynamicProxy proxy;

            using (var readLock = ReadWriteLocker.AcquireReadLock()) {
                _cache.TryGetValue(type, out proxy);
            }

            return(proxy);
        }
コード例 #2
0
        public void CreateNewWrite()
        {
            var locker = ReadWriteLocker.Create <List <int> >();

            using (locker.Write())
            {
                FillList(locker); // ReadWriteLocker supports implicit cast into the wrapped type
                Assert.IsTrue(locker.Lock.IsWriteLockHeld);
                Assert.IsFalse(locker.Lock.IsReadLockHeld);
            }
            Assert.IsFalse(locker.Lock.IsWriteLockHeld);
            Assert.IsFalse(locker.Lock.IsReadLockHeld);
            Assert.AreEqual(3, locker.Value.Count);
        }
コード例 #3
0
        public void CreateRead()
        {
            var list = new List <int> {
                2, 4, 8
            };
            var locker = ReadWriteLocker.Create(list);

            using (locker.Read())
            {
                Assert.IsFalse(locker.Lock.IsWriteLockHeld);
                Assert.IsTrue(locker.Lock.IsReadLockHeld);
                CollectionAssert.AreEqual(new[] { 2, 4, 8 }, locker.Value);
            }
            Assert.IsFalse(locker.Lock.IsWriteLockHeld);
            Assert.IsFalse(locker.Lock.IsReadLockHeld);
        }
コード例 #4
0
        internal static DynamicProxy GetOrAdd(Type type)
        {
            DynamicProxy proxy = null;

            using (var readLock = ReadWriteLocker.AcquireUpgradeableReadLock()) {
                if (!_cache.TryGetValue(type, out proxy))
                {
                    using (var writeLock = readLock.UpgradeToWriterLock()) {
                        proxy = type.CreateProxy();
                        _cache.GetOrAdd(type, proxy);
                    }
                }

                return(proxy);
            }
        }