0

我正在使用 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;
    }
4

0 回答 0