Eu criei um cache usando a classe MemoryCache. Adiciono alguns itens, mas quando preciso recarregar o cache, quero limpá-lo primeiro. Qual é a maneira mais rápida de fazer isso? Devo percorrer todos os itens e removê-los um de cada vez ou existe uma maneira melhor?
100
Respostas:
Dispose
o MemoryCache existente e crie um novo objeto MemoryCache.fonte
Dispose
faz invocar qualquerCacheEntryRemovedCallback
anexado aos itens em cache atuais.O problema com enumeração
A seção MemoryCache.GetEnumerator () Comentários avisa: "Recuperar um enumerador para uma instância de MemoryCache é uma operação que consome muitos recursos e bloqueia. Portanto, o enumerador não deve ser usado em aplicativos de produção."
Aqui está o motivo , explicado no pseudocódigo da implementação GetEnumerator ():
Como a implementação divide o cache em vários objetos Dictionary, ela deve reunir tudo em uma única coleção para devolver um enumerador. Cada chamada para GetEnumerator executa o processo de cópia completo detalhado acima. O Dicionário recém-criado contém referências à chave interna original e aos objetos de valor, para que os valores reais dos dados em cache não sejam duplicados.
O aviso na documentação está correto. Evite GetEnumerator () - incluindo todas as respostas acima que usam consultas LINQ.
Uma solução melhor e mais flexível
Esta é uma maneira eficiente de limpar o cache que simplesmente se baseia na infraestrutura de monitoramento de alterações existente. Ele também fornece a flexibilidade de limpar todo o cache ou apenas um subconjunto nomeado e não tem nenhum dos problemas discutidos acima.
fonte
De http://connect.microsoft.com/VisualStudio/feedback/details/723620/memorycache-class-needs-a-clear-method
A solução alternativa é:
fonte
Select()
faz?fonte
Se o desempenho não for um problema, este belo one-liner fará o truque:
fonte
Parece que existe um método Trim .
Então, para limpar todos os conteúdos, basta fazer
EDITAR: depois de cavar mais um pouco, parece que olhar para Trim não vale o seu tempo
https://connect.microsoft.com/VisualStudio/feedback/details/831755/memorycache-trim-method-doesnt-evict-100-of-the-items
Como faço para limpar um System.Runtime.Caching.MemoryCache
fonte
Você também pode fazer algo assim:
fonte
Encontrei isso e, com base nisso, escrevi um método claro paralelo um pouco mais eficaz:
fonte
Eu estava interessado apenas em limpar o cache e achei isso como uma opção, ao usar o c # GlobalCachingProvider
fonte
uma versão um pouco melhorada da resposta magritte.
fonte
Você pode descartar o cache MemoryCache.Default e, em seguida, reconfigurar o singleton do campo privado como nulo, para fazê-lo recriar o MemoryCache.Default.
fonte