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