gpt4 book ai didi

c# - 无法使用 MemoryCache 访问已处理的对象

转载 作者:行者123 更新时间:2023-12-04 17:37:48 25 4
gpt4 key购买 nike

我收到这条消息:

System.ObjectDisposedException: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.



Controller :
    [HttpGet]
public IActionResult GetAllTags()
{
try
{
return Ok(GetAll());
}
catch(Exception ex)
{
return ControllerHelper.LogAndReturnBadRequest(_logger, ex);
}
}

private IEnumerable<TagDto> GetAll()
{
IEnumerable<TagDto> tags;
if (!_cache.TryGetValue(CacheKeys.States, out tags))
{
tags = _service.GetAll()?.Select(t => _mapper.Map<TagDto>(t));

if(tags != null)
_cache.Set(CacheKeys.States, tags);
}

return tags;
}

启动文件
services.AddMemoryCache();
我正在逐行调试代码,但即使在我的代码的最后一行之后,也完全没有错误。

我看到的错误是在 Kestrel 控制台中。 值得注意的是,错误只发生在从_cache 中提取标签时,而不是第一次直接从数据库中提取标签时发生。

enter image description here

这是我从 Postman 请求中得到的:

enter image description here

许多类似的问题都涉及到处理对象,但在这里您可以看到我的代码中没有处理()或使用()。

最佳答案

我的猜测是您需要在存储在缓存中之前对查询结果进行水化。 Linq 使用延迟执行,这意味着在您尝试枚举结果之前,实际上不会查询基础源。因此,您只是在缓存中存储查询,当您尝试检索实际数据时,底层上下文已被释放。

添加 ToList到您的查询并将列表存储在缓存中:

tags = _service.GetAll()?.Select(t => _mapper.Map<TagDto>(t)).ToList();

我还要注意,返回序列的 linq 查询的结果永远不会为空。它可能是空的,所以如果你不想缓存一个空的结果,你可以将你的空检查更改为 if (tags.Any()) .

关于c# - 无法使用 MemoryCache 访问已处理的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com