none
CacheItemRemovedCallback em código recompilado. RRS feed

  • Pergunta

  • Tenho uma classe que gerencia diversas variáveis definidas por um usuário intermediário e os valores atribuídos por um usuário final, e em virtude da alta demanda de leitura e escrita desses valores era impossível ler e escrever diretamente no banco de dados (ou mesmo utilizando EntityFramework, que é o meu caso) então a classe gerenciadora é 'armazenada' em cache e a cada 120 segundos de não-utilização os valores devem ser salvos na base de dados, para isso eu utilizo o CacheItemRemovedCallback, o problema é que enquanto estávamos em desenvolvimento constante eu atualizava com frequência o código fonte no servidor e foi notado que os valores fornecidos pelo usuário final eram perdidos, ou seja: é bem provável que o método do CacheItemRemovedCallback não esteja sendo executado quando o código é recompilado.

    Meu código é o seguinte:

    		public static GerenciadorVariaveisAvaliacao GetGerenciadorFromCache(Contrato Contrato, ref bool VariaveisAtualizadas)
    		{
    			String cacheName = string.Format("Contrato{0}.CamposValores", Contrato.ID);
    			if (HttpContext.Current.Cache[cacheName] is GerenciadorVariaveisAvaliacao)
    			{
                	GerenciadorVariaveisAvaliacao gva = HttpContext.Current.Cache[cacheName] as GerenciadorVariaveisAvaliacao;
    				gva.Contrato = Contrato; 
    				if (!VariaveisAtualizadas)
    				{
    					gva.AtualizarVariaveis();
    					VariaveisAtualizadas = true;
    				}
    				return gva;
    			}
    			else
    			{
    				// Gerenciador de Variaveis
    				GerenciadorVariaveisAvaliacao GerenciadorVariaveis = new GerenciadorVariaveisAvaliacao(Contrato);
    				HttpContext.Current.Cache.Insert(cacheName, GerenciadorVariaveis, null, DateTime.MaxValue, TimeSpan.FromSeconds(120), System.Web.Caching.CacheItemPriority.High, 
    					(key, value, reason) => {
    						(value as GerenciadorVariaveisAvaliacao).Salvar();
    					});
    				VariaveisAtualizadas = true;
    				return GerenciadorVariaveis;               
    			}
    		}

    Existe alguma maneira mais elegante de resolver este problema? Pois o que estou fazendo hoje é: esperar até 3 da manha quando não tem ninguém online e fazer as atualizações, mas isso eventualmente irá se tornar inviável.

    O endereço do meu sistema é www.contratosnahora.com.br 


    Flash


    • Editado Flash3001 sexta-feira, 12 de abril de 2013 16:43
    sexta-feira, 12 de abril de 2013 16:36