Disponível desde a versão 4 do .NET Framework, a classe MemoryCache funciona de maneira similar ao cache do ASP.NET, exceto pelo fato de que a classe MemoryCache foi criada para ser utilizada em qualquer tipo de aplicação .NET, não apenas em aplicações ASP.NET.
Outra vantagem da classe MemoryCache é que ela é thread safe. Essa característica assegura o seu uso em operações assíncronas, operações executadas paralelamente e acessos originados de diferentes threads.
A classe MemoryCache possui uma propriedade chamada CacheMemoryLimit. Essa propriedade define a quantidade de memória (em bytes) que pode ser utilizada para o armazenamento de dados em cache. Se o limite de memória for excedido, então a classe MemoryCache passa a remover os dados de cache automaticamente, a fim de permitir a entrada de novos dados em cache sem exceder o limite configurado. Outra propriedade existente é a PhysicalMemoryLimit, que determina a porcentagem máxima de memória física que pode ser consumida pelo cache. Se ambas as propriedades forem configuradas com ZERO, então o uso de memória é dinamicamente alocado – este é o comportamento padrão.
Outra vantagem desta classe é que ela pode ser configurada em arquivos App.Config e Web.Config. O trecho de código abaixo demonstra como a classe MemoryCache pode ser configurada:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name="Default" physicalMemoryLimitPercentage="0" cacheMemoryLimitMegabytes="0" />
</namedCaches>
</memoryCache>
</system.runtime.caching>
</configuration>
Seu uso é tão simples quanto as demais soluções de cache. Abaixo uma demonstração do seu funcionamento:
private IEnumerable<RegionalState> GetAllRegionaStates() {
ObjectCache cache = MemoryCache.Default;
IEnumerable<RegionalState> returnValue = cache["states"] as IEnumerable<RegionalState>;
if (returnValue == null) {
var repository = new RegionalStatesRepository();
returnValue = repository.GetRegionalStates();
cache.Set("states",
returnValue,
new DateTimeOffset(DateTime.Now.AddMinutes(10)));
//or another possibility...
//cache.Set("states",
// returnValue,
// new CacheItemPolicy() {
// AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(10))
// });
}
return returnValue;
// Obs:
// RegionalState and RegionalStatesRepository are just samples...
// So don't worry about the use of these classes!
}
Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#
Referências:
http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.100).aspx
http://msdn.microsoft.com/pt-br/library/system.runtime.caching.cacheitempolicy(v=vs.110).aspx