c# - 在什么时候使用 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 在调试中向我展示了这一点:
解决方案
它在右括号之后立即处理(如果您的意思是这样的结构):
using (var reader = new StringReader(manyLines))
{
string? item;
do {
item = reader.ReadLine();
Console.WriteLine(item);
} while(item != null);
}
// reader disposed here
推荐阅读
- javascript - Firefox自动打印很慢......有没有办法加快速度或者我做错了什么?
- node.js - 强大的文件上传使用“结束”事件
- python - 如何在 Python3 中获取 0.5^(5000) 的值?
- swift - SwiftUI onChange(of: ...) 更新 StateObject
- java - LambdaMetaFactory 和私有方法
- regex - 正则表达式过滤掉 Chrome 开发工具中的控制台警告
- asp.net-core - ASP.NET Core 3.1 热重载慢
- react-native - React Navigation 6.x 嵌套导航缺少 route.id
- go - 调试模式下的奇怪切片模式 - Go 和 Visual Studio 代码
- python - Matplotlib - 重复轴 - 防止网格线覆盖数据 - 设置正确的 ylabel