Enterprise缓存块中存在大小限制的奇怪行为

时间:2013-07-16 07:34:21

标签: c#-4.0 enterprise-library

我正在使用entlib 5.0.1。我使用代码配置

创建了一个缓存
IContainerConfigurator configurator = 
    new UnityContainerConfigurator(_unityContainer);
configurator.ConfigureCache(item.PartitionName, item.MaxItemNumber);
CacheBlockImp block = new CacheBlockImp(
    _unityContainer.Resolve<ICacheManager>(item.PartitionName), 
    item.PartitionType);

我看到了一个大小限制的奇怪行为,我已经配置了缓存以容纳15个项目,我在循环中添加了18个项目,我怀疑是否只添加了15个项目,但我得到8个,当时我添加了一个刷新操作 - 当1个项目撤离时通知,我真的看到其中7个被疏散,所有项目具有相同的优先级。

class Program
{
    static void Main(string[] args)
    {
        var unityContainer = new UnityContainer();
        IContainerConfigurator configurator = new UnityContainerConfigurator(unityContainer);

        configurator.ConfigureCache("Test", 10);

        var cache = unityContainer.Resolve<ICacheManager>("Test");

        for (int i = 0; i < 18; i++)
        {
            var dummy = new Dummy()
            {
                ID = i,
                Data = "hello " + i.ToString()
            };

            cache.Add(i.ToString(), dummy, CacheItemPriority.Normal, null, null);
        }

        Thread.Sleep(1000);
        int count = cache.CachedItems().Count;
    }

    public class Dummy
    {
        public int ID { get; set; }
        public string Data { get; set; }
    }


}


public static class CacheBlockExtension
{
    public static void ConfigureCache(this IContainerConfigurator configurator, string configKey,
        int maxNumOfItems)
    {
        ConfigurationSourceBuilder builder = new ConfigurationSourceBuilder();

        DictionaryConfigurationSource configSource = new DictionaryConfigurationSource();

        // simple inmemory cache configuration
        builder.ConfigureCaching().ForCacheManagerNamed(configKey).WithOptions
            .StartScavengingAfterItemCount(maxNumOfItems)
            .StoreInMemory();
        builder.UpdateConfigurationWithReplace(configSource);

        EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource);
    }

    public static List<object> CachedItems(this ICacheManager cachemanger)
    {
        Microsoft.Practices.EnterpriseLibrary.Caching.Cache cache =
            (Microsoft.Practices.EnterpriseLibrary.Caching.Cache)cachemanger.GetType().GetField("realCache", System.Reflection.BindingFlags.Instance |
           System.Reflection.BindingFlags.NonPublic).GetValue(cachemanger);

        List<object> tmpret = new List<object>();

        foreach (DictionaryEntry Item in cache.CurrentCacheState)
        {
            Object key = Item.Key;
            CacheItem cacheItem = (CacheItem)Item.Value;
            tmpret.Add(cacheItem.Value);
        }

        return tmpret;
    }

0 个答案:

没有答案