在什么时候使用System.Runtime.Caching处理对象

问题描述

我正在使用System.Runtime.Caching将变量持久保存在缓存中,但是后来我无法访问它们,因为它们被处置了,并且程序在消息中抛出了ObjectdisposedExceptionDbContext has been disposed

我没有执行Object.dispose(),所以类ObjectCache会将它放在后台

什么时候发生在什么时候?做完cache.add之后?

可以避免吗?

我是怎么做到的:

创建列表:

using (GesbrokerSuiteEntities ctx = new GesbrokerSuiteEntities())
                {
                   
                    rel_tareas_orquestador nuevoregistroOrquestador = new rel_tareas_orquestador();

                    nuevoregistroOrquestador.id_robot_hija = idProyindividual;
                    nuevoregistroOrquestador.id_robot_padre = 2;
                    nuevoregistroOrquestador.id_robot_tarea_padre = "2";
                    nuevoregistroOrquestador.id_robot_tarea_hija = idProyindividual - 1+"";
                    nuevoregistroOrquestador.id_tarea_hija = Int32.Parse(id2);
                    nuevoregistroOrquestador.id_tarea_padre = 2;
                    nuevoregistroOrquestador.sincronizada = 2;
                    nuevoregistroOrquestador.esperar_padre_completa = 2;

                    ctx.rel_tareas_orquestador.Add(nuevoregistroOrquestador);
                    listaRelTareasOrquestador.Add(ctx);

1-添加要缓存的列表

CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
cacheItemPolicy.AbsoluteExpiration = DateTime.Now.AddHours(1.0);
                    
cache.Add("listaOrquestador",listObject,cacheItemPolicy);

2-然后我用另一种方法得到它

listaRelTareasOrquestador = (List<GesbrokerSuiteEntities>)cache.Get("listaOrquestador");

此后,我无法访问列表的内容,因为它已被丢弃。

更新:随着using()的使用,元素不会被处置。

在这是我们遇到的问题,当尝试获取保存的值时,它将获取数据库行:

nuevoregistroOrquestador.id_robot_hija = listaRelTareasOrquestador[0].rel_tareas_orquestador.FirstOrDefault().id_robot_hija;

我知道它正在数据库中执行查询,以任何方式获取之前保存的数据?就像局部变量一样。

更新2

现在,当我尝试访问列表中的值时,我没有收到以前的值:

rel_tareas_orquestador nuevoregistroOrquestador = new rel_tareas_orquestador();

nuevoregistroOrquestador.id_robot_hija = listaRelTareasOrquestador[0].rel_tareas_orquestador.FirstOrDefault().id_robot_hija;
nuevoregistroOrquestador.id_robot_padre = registro.rel_tareas_orquestador.FirstOrDefault().id_robot_padre;
nuevoregistroOrquestador.id_robot_tarea_padre = registro.rel_tareas_orquestador.FirstOrDefault().id_robot_tarea_padre;
nuevoregistroOrquestador.id_robot_tarea_hija = registro.rel_tareas_orquestador.FirstOrDefault().id_robot_tarea_hija;

我知道这些方法会由于查询而返回数据库值,我如何访问以前保存的列表值?

Visual Studio向我展示了调试过程:

enter image description here

解决方法

它被放置在右括号之后(如果您是说这样的结构):

using (var reader = new StringReader(manyLines))
{
    string? item;
    do {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while(item != null);
}
// reader disposed here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...