访问 MemoryCache 是否会创建副本?

2024-02-10

我有一个这样的缓存服务:

public interface ICacheService {
    T Get<T>(string cacheID, Func<T> getItemCallback, int cacheMinutes = 5) where T : class;
}

public class MemoryCacheService : ICacheService {
    public T Get<T>(string cacheId, Func<T> getItemCallback, int cacheMinutes = 5) where T : class {
        T item = MemoryCache.Default.Get(cacheId) as T;
        if (item == null) {
            item = getItemCallback();
            MemoryCache.Default.Add(cacheId, item,
                new CacheItemPolicy {AbsoluteExpiration = DateTime.Now.AddMinutes(cacheMinutes)});
        }
        return item;
    }
}

并像这样检索:

var result = _cache.Get("mylist", () => _database.Fetch<MyList>().AsQueryable(), 600);

该列表很大,并且在每次击键的预先输入下拉列表中经常访问。而且查询条件也是动态的,比如

if (this) result = result.Where(x=> this ...)
if (that) result = result.Where(x=> that ...)
finally result.ToList() 

我想知道,每次我从缓存访问列表时,系统是否会在开始构建 linq 查询之前创建数据的副本?如果是这样,就像每次击键复制一样,效率不高。或者它是否推迟了查询,因为我正在检索 AsQueryable 并构建 linq?

还有更好的选择吗?谢谢


不,MemoryCache 不会进行复制。您基本上存储对缓存中某个对象实例的引用,这就是您访问缓存中的项目时返回的内容。

我没有正式的文档链接,但在实践中发现了“困难的方法”,我仅使用返回的引用(而不复制它)意外地修改了缓存的对象。

另外,研究参考来源(http://referencesource.microsoft.com http://referencesource.microsoft.com)表明没有发生自动复制。

根据您的应用程序和需求,您可能希望确保缓存的类型实际上在设计上是不可变的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 MemoryCache 是否会创建副本? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • AudioPlayer iOS 和 m4a

    我制作了一个使用 AVAudioPlayer 播放音乐的应用程序 它上传或下载歌曲 将它们写入核心数据 然后在选择时调用它们来播放 我测试过的所有 15 首歌曲都可以在 iPhone 音乐客户端和我自己的电脑上正常运行 但是 其中三个无法在
  • 动态复选框创建

    我想在我的 Android 应用程序运行时动态创建一组复选框 当应用程序运行时 除了按钮之外什么都不显示 我忘记了什么 提前致谢 public class DataNotificationSurvey extends Activity pr
  • 使用 PHP 在 CSV 文件中用双引号将每个字段括起来?

    我需要使用 PHP 将所有带有双引号的字符串和数字放入 CSV 文件中 如何从 PHP 创建 CSV 文件 并将所有数据放在双引号内 我正在使用此代码生成 CSV 我正在使用 codeigniter 框架 array array array
  • jQuery 切换 Cookie 支持

    我正在尝试将 jQuery Cookie 插件实现到我的幻灯片切换脚本中 但到目前为止尚未成功 这是我的代码 没有任何 cookie 实现 jQuery document ready function a toggle click func
  • Eclipse 缩进指南

    我正在尝试从以下网页安装 eclipse 的缩进指南插件 http sschaef github io IndentGuide http sschaef github io IndentGuide 我之前没有在 eclipse 中安装过插件
  • 进行机器间锁定有哪些好方法?

    我们的服务器集群由 20 台机器组成 每台机器有 10 个 5 个线程的 pid 我们想要某种方法来防止任何机器上任何 pid 中的任何两个线程同时修改同一个对象 我们的代码是用 Python 编写的并在 Linux 上运行 如果这有助于缩
  • 当应用程序在 WP 8.1 商店应用程序中恢复时,应用程序恢复事件不会触发

    我的 WP 8 1 商店应用程序的行为非常奇怪 当我快速离开然后返回时 应用程序恢复事件会按预期触发 但是 如果我将应用程序保留在后台一段时间 然后返回时 应用程序将触发 Constructor 和 OnNavigateTo 事件而不是 R
  • 检查 Rust 中的整数溢出[重复]

    这个问题在这里已经有答案了 Rust 有没有一种规范的方法来显式检查整数溢出 我用谷歌搜索但找不到答案 就像是 match add or overflow x y None gt println overflow Some z gt pri
  • 如何子类化 UILabel、UIButton 等 UI 元素

    我正在子类化UILabel in a CustomLabel class 当我尝试使用简单的方法时遇到问题UILabel我希望将来对其他元素进行子类化 我读到我可以创建一个category of UILabel 这东西哪一个比较好呢 类别还
  • Ansible Galaxy 角色安装到特定目录?

    所以我想我应该尽可能开始使用 Ansible Galaxy 而不是编写自己的角色 我刚刚安装了我的第一个角色 它被安装到 etc local ansible roles 我在 OSX 上 现在我想知道你如何在我真正需要的地方安装这个角色 我
  • Visual Studio 2012 附带哪个版本的 Dinkumware STL Lib?

    在早期版本的 Visual Studio 中 有一个预定义的宏 CPPLIB VER 它报告此版本 VS 附带的 Dinkumware STL 库的版本 截至 2012 年 我无法找到或使用这个宏 它未定义 并且我无法在网上找到有关此事的任
  • Sitecore 中的常规链接

    我是 Sitecore 的新手 我创建了一个页面模板 并为 常规链接 类型的 URL 添加了一个字段 我为链接文本创建了另一个字段 这是该项目中的标准做法 我只是想在我的用户控件中显示链接 但我无法让它工作 这应该很简单 但我在兜圈子 这是
  • 非焦点窗体上的 C#/WPF 热键(如 launchy)

    Is it possible to catch a hotkey eg Ctrl Space from a not focused form to make it appear whenever someone uses this spec
  • 我可以在 Fortran 中使用可分配数组作为意图(输出)矩阵吗?

    考虑以下子例程 subroutine myProc m n flag X Integer intent in m n logical intent in flag real 8 intent out allocatable X if fla
  • 在我的 Pixel Shader(UWP、Win2D)中支持多种颜色输入

    我一直在开发一款可以提供颜色替换的应用程序 并且在解决方案上从 Jet Chopper 获得了很多帮助 他为我提供了以下代码 该代码本质上使用 ControlSpectrum 控件来控制源颜色和目标颜色 这个想法是您指定一个源颜色 然后将其
  • 使用 JQuery Ajax Post 调用渲染简单的 ASP.NET MVC PartialView

    我的 MVC 控制器中有以下代码 HttpPost public PartialViewResult GetPartialDiv int id drop down value PartyInvites Models GuestRespons
  • 如何开始使用 Akka Streams? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Akka Streams 库已经提供了相当多的丰富的文档 http doc akka io docs akka 2 4 2 RC1 s
  • SPSS - 合并具有 ID 变量重复案例和新案例/变量的文件

    我有一个多年来商店访问的管理数据集 我正在尝试将其合并到ID多变的 每个数据集都有一个重复项ID发生在不同的商店访问期间 注释为Date 一些较新的数据文件也有新变量 Y 不包含在旧数据文件中 不同年份的数据集也会包含不同的案例 由不同的案
  • MKMapView 在其超级视图被解除分配后仍然向委托发送消息

    编辑 更改了标题 我当时不知道 但这是重复的如果我不再使用 MKMapView 为什么在释放它后我会崩溃 https stackoverflow com questions 2188098 why am i crashing after m
  • 访问 MemoryCache 是否会创建副本?

    我有一个这样的缓存服务 public interface ICacheService T Get