Если у кого-то будут проблемы в будущем (как у меня) - вот полный код для очистки кеша.

аюсь преобразовать решение с использованием EntLib в использование кэширования AppFabric. С помощью нескольких методов расширения это довольно безболезненный процесс.

Методы расширения, которые я использую:

public static bool Contains(this DataCache dataCache, string key)
{
    return dataCache.Get(key) != null;
}

public static object GetData(this DataCache dataCache, string key)
{
    return dataCache.Get(key);
}

Но есть две особенности EntLib, которые мне трудно преобразовать. А именно «Count» (подсчет количества ключей в кеше) и «Flush» (удаление всех данных из кеша). И то и другое можно было бы решить, если бы я мог перебирать ключи в кеше.

Есть метод, который называетсяClearRegion(string region), но это потребовало от меня указать имя региона во всех используемых мной методах Get / Put / Add, что потребовало бы ручной работы, подверженной ошибкам.

Есть ли способ получить список ключей в кеше?
Могу ли я использовать имя региона по умолчанию?
Как можно очистить кэш, если я не использовал название региона?

 Tedd Hansen14 янв. 2011 г., 15:45
Код позволил мне заменить ".Count == 0" на метод .Contains () выше.

Ответы на вопрос(2)

для очистки кеша.

private static DataCacheFactory _factory;
        private const String serverName = "<machineName>";
        private const String cacheName = "<cacheName>";

        static void Main(string[] args)
        {
            Dictionary<String, Int32> cacheHostsAndPorts = new Dictionary<String, Int32> { { serverName, 22233 } };
            Initialize(cacheHostsAndPorts);
            DataCache cache = _factory.GetCache(cacheName);
            FlushCache(cache); 
            Console.WriteLine("Done");
            Console.ReadLine();
        }

        private static void FlushCache(DataCache cache)
        {
            foreach (string regionName in cache.GetSystemRegions())
            {
                cache.ClearRegion(regionName);
            }
        }

        public static void Initialize(Dictionary<String, Int32> cacheHostsAndPorts)
        {
            var factoryConfig = new DataCacheFactoryConfiguration
            {
                Servers = ,cacheHostsAndPorts.Select(cacheEndpoint => new DataCacheServerEndpoint(cacheEndpoint.Key, cacheEndpoint.Value))
            };

            _factory = new DataCacheFactory(factoryConfig);
        }
Решение Вопроса

мой предыдущий ответ для меняспекуляция как кеш работает внутренне, когда вы не указываете регион, и как вы можете получить количество объектов, которые не находятся в именованном регионе.

Мы можем построить метод Flush, используя ту же технику:

public void Flush (this DataCache cache)
{
    foreach (string regionName in cache.GetSystemRegions()) 
    {     
        cache.ClearRegion(regionName) 
    } 
}

Как я уже сказал, я думаю, что названные регионывероятно путь - мне кажется, что их использование решает больше проблем, чем создает.

 Nicolas Irisarri04 мар. 2011 г., 00:27
Если вы используете регионы, вы потеряете распределенную часть кэша, так как регионы создаются только на одном хосте кэша. Я думаю, что в целом вы захотите держаться подальше от регионов, если у вас нет особых причин использовать их (т. Е. Теги).
 Tedd Hansen14 янв. 2011 г., 15:24
Благодарю. Кажется, он создал целый набор регионов автоматически. Default_Region_0000 - Default_Region_1023. Очистка всех показывает, что они пусты (Get-CacheStatistics).

Ваш ответ на вопрос