コード例 #1
0
        public void TimedLRUCache_Flush()
        {
            TimedLRUCache <int, int> cache;

            cache = new TimedLRUCache <int, int>();
            Assert.IsFalse(cache.RenewTTD);

            cache.Add(0, 0, TimeSpan.FromSeconds(1.0));
            cache.Add(1, 1, TimeSpan.FromSeconds(1.0));
            cache.Add(2, 2, TimeSpan.FromSeconds(2.0));
            cache.Add(3, 3, TimeSpan.FromSeconds(2.0));

            Assert.IsTrue(cache.ContainsKey(0));
            Assert.IsTrue(cache.ContainsKey(1));
            Assert.IsTrue(cache.ContainsKey(2));
            Assert.IsTrue(cache.ContainsKey(3));

            Thread.Sleep(TimeSpan.FromSeconds(1) + SysTime.Resolution);
            cache.Flush();

            Assert.IsFalse(cache.ContainsKey(0));
            Assert.IsFalse(cache.ContainsKey(1));
            Assert.IsTrue(cache.ContainsKey(2));
            Assert.IsTrue(cache.ContainsKey(3));

            Thread.Sleep(TimeSpan.FromSeconds(1) + SysTime.Resolution);
            cache.Flush();

            Assert.IsFalse(cache.ContainsKey(0));
            Assert.IsFalse(cache.ContainsKey(1));
            Assert.IsFalse(cache.ContainsKey(2));
            Assert.IsFalse(cache.ContainsKey(3));
        }
コード例 #2
0
        /// <summary>
        /// Called periodically on a background thread to handle background
        /// tasks such as flushing the cache.
        /// </summary>
        /// <param name="o">Not used.</param>
        private void OnBkTimer(object o)
        {
            using (TimedLock.Lock(this))
            {
                if (!isOpen)
                {
                    return;
                }

                if (cache != null && cacheFlushTime <= SysTime.Now)
                {
                    cache.Flush();
                    cacheFlushTime = SysTime.Now + cacheFlushInterval;
                }
            }
        }
コード例 #3
0
        public void TimedLRUCache_AutoDispose()
        {
            TimedLRUCache <int, TestItem> cache;
            DisposableItem dItem0 = new DisposableItem(0);
            DisposableItem dItem1 = new DisposableItem(1);
            DisposableItem dItem2 = new DisposableItem(2);
            TestItem       item0  = new TestItem(0);
            TestItem       item1  = new TestItem(1);
            TestItem       item2  = new TestItem(2);

            cache             = new TimedLRUCache <int, TestItem>();
            cache.AutoDispose = true;
            cache.DefaultTTL  = TimeSpan.FromMilliseconds(200);

            // Verify that disposable items are disposed when they
            // are implicitly removed from the cache when the maximum
            // number of items allowed has been exceeded.

            cache.MaxItems = 2;
            cache.Add(0, dItem0);
            cache.Add(1, dItem1);
            cache.Add(2, dItem2);

            Assert.AreEqual(2, cache.Count);
            Assert.IsTrue(dItem0.IsDisposed);
            Assert.IsFalse(dItem1.IsDisposed);
            Assert.IsFalse(dItem2.IsDisposed);

            // Verify that disposable items are disposed when the
            // cache is cleared.

            cache.Clear();
            Assert.IsTrue(dItem1.IsDisposed);
            Assert.IsTrue(dItem2.IsDisposed);

            // Verify that disposable items are disposed when they
            // are explicitly removed.

            dItem0.IsDisposed = false;
            cache.Add(0, dItem0);
            cache.Remove(0);
            Assert.IsTrue(dItem0.IsDisposed);

            // Verify that disposable items are disposed when they
            // are replaced in the cache.

            cache.Clear();
            dItem0.IsDisposed = false;
            dItem1.IsDisposed = false;
            cache.Add(0, dItem0);
            cache[0] = dItem1;
            Assert.IsTrue(dItem0.IsDisposed);

            // Verify that replacing the same disposable item instance
            // doesn't dispose the object.

            cache.Clear();
            dItem0.IsDisposed = false;
            cache.Add(0, dItem0);
            cache[0] = dItem0;
            Assert.IsFalse(dItem0.IsDisposed);

            // Verify disposal after flushing.

            cache.Clear();
            dItem0.IsDisposed = false;
            dItem1.IsDisposed = false;
            dItem2.IsDisposed = false;
            cache.Add(0, dItem0);
            cache.Add(1, dItem1);
            cache.Add(2, dItem2);
            Thread.Sleep(250);
            cache.Flush();
            Assert.IsTrue(dItem0.IsDisposed);
            Assert.IsTrue(dItem1.IsDisposed);
            Assert.IsTrue(dItem2.IsDisposed);

            cache.Clear();
            dItem0.IsDisposed = false;
            dItem1.IsDisposed = false;
            dItem2.IsDisposed = false;
            cache.Add(0, dItem0);
            cache.Add(1, dItem1);
            cache.Add(2, dItem2);
            Thread.Sleep(250);
            cache.FlushLRU();
            Assert.IsTrue(dItem0.IsDisposed);
            Assert.IsTrue(dItem1.IsDisposed);
            Assert.IsTrue(dItem2.IsDisposed);

            // Verify that non-disposable items don't cause trouble
            // when AutoDispose=true

            cache.Clear();
            cache.Add(0, item0);
            cache.Add(1, item1);
            cache.Add(2, item2);
            cache.Remove(1);
            cache[1] = new TestItem(3);
            cache[2] = cache[2];
            cache.Clear();

            cache.Add(0, item0);
            cache.Add(1, item1);
            cache.Add(2, item2);
            Thread.Sleep(250);
            cache.Flush();

            cache.Add(0, item0);
            cache.Add(1, item1);
            cache.Add(2, item2);
            Thread.Sleep(250);
            cache.FlushLRU();
        }