问题描述
我正在使用System.Runtime.Caching将变量持久保存在缓存中,但是后来我无法访问它们,因为它们被处置了,并且程序在消息中抛出了ObjectdisposedException
:DbContext 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向我展示了调试过程:
解决方法
它被放置在右括号之后(如果您是说这样的结构):
using (var reader = new StringReader(manyLines))
{
string? item;
do {
item = reader.ReadLine();
Console.WriteLine(item);
} while(item != null);
}
// reader disposed here