首页 > 解决方案 > 在什么时候使用 System.Runtime.Caching 处理对象

问题描述

我正在使用 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 在调试中向我展示了这一点:

在此处输入图像描述

标签: c#cachingentitydispose

解决方案


它在右括号之后立即处理(如果您的意思是这样的结构):

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

推荐阅读