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