如何管理缓存的IDisposable对象?

2024-01-22

我有一个创建成本很高的对象,它使用一些非托管资源,这些资源在完成后必须显式释放,因此实现 IDisposable()。我想要一个缓存,例如这些昂贵的资源,以便最小化创建成本,但我不知道如何处理处置。

如果使用对象的方法负责处置,那么我最终会在缓存中得到已处置的实例,然后必须重新创建这些实例,从而破坏了缓存的意义。如果我不在使用它们的方法中处置对象,那么它们永远不会被处置。我认为当它们从缓存中取出时我可以处理它们,但随后我可能最终会处理一个仍在被方法使用的实例。

让它们超出范围并由垃圾收集器收集并释放此时的资源是否有效?这感觉是错误的,并且违背了它们是一次性的想法......


一次性物品总是需要有一个明确的所有者来负责处置它们。然而,这并不总是创建它们的对象。此外,所有权可以转让。

认识到这一点,解决方案就变得显而易见了。不要丢弃,回收!您不仅需要一种从缓存获取资源的方法,还需要一种返回资源的方法。此时,缓存再次成为所有者,并且可以选择保留资源以供将来使用或处置它。

   public interface IDisposableItemCache<T> : IDisposable
      where T:IDisposable 
   {
      /// <summary>
      /// Creates a new item, or fetches an available item from the cache.
      /// </summary>
      /// <remarks>
      /// Ownership of the item is transfered from the cache to the client.
      /// The client is responsible for either disposing it at some point,
      /// or transferring ownership back to the cache with
      /// <see cref="Recycle"/>.
      /// </remarks>
      T AcquireItem();

      /// <summary>
      /// Transfers ownership of the item back to the cache.
      /// </summary>
      void Recycle(T item);

   }

edit:我刚刚注意到这个想法在Spring中也存在,在那里它被称为对象池 http://www.springframework.net/doc/sdk/2.0/html/Spring.Core~Spring.Pool.IObjectPool_members.html. Their BorrowObject and ReturnObject方法与我的示例中的方法匹配。

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

如何管理缓存的IDisposable对象? 的相关文章

  • 元素属性语法和属性属性语法之间有语义差异吗?

    我认为元素属性语法和属性属性语法在语义上没有太大区别 但是 我发现一定有什么不同 例如 下面的例子只是演示了一个简单的触发器
  • 强制 Mpeg2 解复用器使用 ffdshow 渲染 H 264 数字电视视频

    不幸的是 我花了很多时间尝试使 DirectShow 的 DTVViewer 示例正常工作 但没有成功 DVBT网络的视频格式是H264 我发现IntelliConnect行为IFilterGraph更喜欢使用 Mpeg2 视频格式 对于那
  • .NET 中严格浮点数学的库

    我有 Java 算法 计算及其单元测试 单元测试期望结果具有一定的精度 增量 现在我将算法移植到 NET 中 并希望使用相同的单元测试 我使用双数据类型 问题在于 Java 使用 strictfp 64 位 来执行 Math 类中的某些操作
  • 确定最接近的已知颜色

    我允许我的应用程序的用户选择自定义颜色 并希望有一种方法来显示每种颜色的友好名称 而不是显示十六进制代码的文本表示形式 我如何找到最近的System Drawing Color对于给定的十六进制代码 希望这对某人有帮助 Public Fun
  • ASP.NET MVC ActionFilterAttribute 在模型绑定之前注入值

    我想创建一个自定义操作过滤器属性 该属性在模型绑定期间可访问的 HttpContext 项中添加一个值 我尝试将其添加到 OnActionExecuting 中 但似乎模型绑定是在过滤器之前执行的 你知道我该怎么做吗 也许模型绑定器中有一个
  • C#:询问用户密码,然后将其存储在 SecureString 中

    在我目前为客户开发的小型应用程序中 我需要询问用户他的 Windows 登录用户名 密码和域 然后使用这些信息系统 诊断 进程 启动启动一个应用程序 我有一个带有 UseSystemPasswordChar 的文本框来屏蔽输入的密码 我需要
  • string.Empty 与 null。您使用哪一个?

    最近工作的同事告诉我不要使用string Empty设置字符串变量时但使用null因为它污染了堆栈 他说不做 string myString string Empty but do string mystring null 真的有关系吗 我
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 忽略正则表达式匹配的空格

    我需要匹配 8 个或更多数字 其序列可以包含空格 例如 以下所有内容都是有效匹配 12345678 1 2345678 12 3 45678 1234 5678 12 34567 8 1 2 3 4 5 6 7 8 此刻我有 d 8 但这只
  • 有条件地忽略属性序列化

    我有一个 Asp Net WebApi 项目 我想返回 Json 格式的产品列表和一个特定产品 这是我的产品型号 public class Product public int Id get set public string ShortS
  • WM_CLOSE 和 SC_CLOSE 之间的区别

    我只是想知道这两个消息常量之间有什么区别 我应该使用哪一个WndProc重写时的方法 用于处理关闭按钮消息 WM CLOSE http msdn microsoft com en us library windows desktop ms6
  • 如何将位写入文件?

    如何使用 c net 将位 而不是字节 写入文件 我很坚持它 Edit 我正在寻找一种不同的方法 将每 8 位写为一个字节 一次可以写入的最小数据量是一个字节 如果您需要写入单独的位值 例如 二进制格式需要 1 位标志 3 位整数和 4 位
  • ConcurrentBag 中可能存在内存泄漏吗?

    我一直在研究新的并发集合 特别是 ConcurrentBag 引起了我的注意 由于 ConcurrentBag 在每个单独的线程上内部保存一个本地集 使用它来跟踪项目 这意味着当线程本身超出范围时 ConcurrentBag 仍将在内存中引
  • 如何访问 TabControl 选项卡内的控件?

    这就是我到目前为止所拥有的一切 tabControl1 TabPages 0 我的 TabControl 的 TabPage1 中有一个 PictureBox 如何使用代码而不是属性窗格更改图像位置 尽管控件出现在容器内 作为 TabCon
  • jQuery.getJSON:如何避免在每次刷新时请求 json 文件? (缓存)

    在此示例中 您可以看到生成的 HTML 列表 每次刷新时 脚本都会请求数据文件 ajax test json 并再次构建列表 生成的文件 ajax test json 被静态缓存 但是如何避免在每次刷新时请求此文件 source jquer
  • 浏览器如何比较 URL 进行缓存?

    具体来说 URL 的哪些部分用于比较 假设我在以下位置提供 CSS 样式表https www example com a b test css具有适当的 HTTP 标头cache control max age等等 当用户稍后访问以下每个
  • 如何为二进制格式化程序创建 SerializationBinder,以处理类型从一个程序集和命名空间到另一个程序集和命名空间的移动

    上下文如下 我想通过将代码移动到不同的项目来重构代码 其中一些代码包含可序列化的 DTO 用于 跨多个端点发送和接收数据 如果我移动代码 序列化就会中断 因此它不是 向后兼容我的应用程序的旧版本 这个问题的一个解决方案是 Serializa
  • 从 SQL 语句中检索元数据(表名)

    我使用的是 Visual Studio 2008 我创建了一个 Winforms 应用程序 并且尝试从 SQL 语句中提取表名 con new SqlConnection connString String queryString Sele
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime

随机推荐

  • android 是否可以在来电或去电时录制通话

    在android中 可以在不打开手机扬声器的情况下在来电 去电期间录制语音通话 我在android市场上看到过一个应用程序 由于它使用麦克风进行录音 因此在不打开扬声器的情况下无法正确记录对方的声音 可以通过其他技术来完成吗 final M
  • 从两个不同的脚本写入和读取 fifo

    我有两个 bash 脚本 一个脚本写入 fifo 第二个从 fifo 读取 但在第一个结束之后写入 但有些东西不起作用 我不明白问题出在哪里 这是代码 第一个脚本是 作者 bin bash fifo name myfifo Se non e
  • Git 将文件添加到存储库

    我遵循基本的 Git 教程并添加了 README 文件 效果很好 然后我将项目文件复制到同一文件夹并尝试通过运行将它们添加到存储库 git add all git ci test my alias for commit git push o
  • git 项目的 Eclipse 设置

    关于这个话题有很多问题 但目前还没有令人满意的答案 例如this https stackoverflow com questions 8820668 the current branch is not configured for pull
  • ARM Data Abort错误异常调试

    所以现在我明白我遇到了 ARM 数据中止异常 我了解了如何捕获异常本身 STL 库中的错误地址 但我想在异常之前返回堆栈帧 我正在使用 IAR 工具链 它告诉我异常后调用堆栈不可用 有没有一种技巧可以说服工具向我显示调用堆栈 感谢您的快速帮
  • 滚动窗口重访 - 添加窗口滚动数量作为参数 - 向前分析

    我一直在网上搜索可以创建的方法滚动窗户这样我就可以以通用的方式对时间序列执行称为前向分析的交叉验证技术 然而 我还没有找到任何在 1 窗口大小方面具有灵活性的解决方案 几乎所有方法都有这个 例如 pandas rolling https p
  • 拖动选项卡以将其置于前面

    我正在将数据从应用程序外部拖到 TabControl 上 我希望能够拖动 选项卡 并将该选项卡带到前面 TabControl 和 TabItems 上的拖动事件似乎仅针对活动选项卡触发 并且仅在拖动选项卡内容而不是 选项卡 本身时触发 该控
  • 增加图形库和访问者

    我正在编写一个用于操作键图的库 并且我正在使用 Boost Graph Library 来存储数据 不幸的是 我似乎无法弄清楚如何使用它来实现正确的访问者模式 因为您无法对顶点进行子类化 您必须依赖 属性 库中提供的访问者框架似乎非常适合使
  • 如何通过电子邮件向某人发送 git 存储库?

    我努力了 git archive HEAD format zip gt archive zip 然后我通过电子邮件发送 archive zip 在另一端他们将 archive zip 解压缩到一个文件夹中 但是当他们尝试任何 git 命令时
  • 从 DataTemplate UWP 绑定 UserControl DP

    我有一个FlipView这表明雕像 雕像包含一个Path到他们的形象 将此属性绑定到常规 DataTemplate 就可以了 下面的代码工作正常
  • 指向页面部分的锚链接在浏览器刷新、后退和前进时不起作用

    我制作了一个 html 页面 页面内有链接 div a href first first a a href second second a div First div div div Second div div div 但此代码不适用于页
  • 如何配置 rhino 为 angularjs 控制器运行 jasmine 测试

    我在使用 Jasmine sbt 插件为 Angular JS 应用程序进行单元测试时遇到问题 当我将 angular js 版本 1 3 1 添加到 test dependency js 时 EnvJasmine loadGlobal E
  • F# printfn 异常

    任何人都可以解释为什么这会导致错误 let xs Mary Mungo Midge Array iter printfn xs 虽然这不会 Array iter printfn Mary Mungo Midge printfn 的签名是Pr
  • 如何让 Django 将调试信息打印到控制台?

    我使用 urllib 来访问我的应用程序而不是浏览器 因此发生错误时我看不到调试屏幕 将正常调试信息发送到控制台或文件的最佳方法是什么 编辑 我已经捕获了页面的输出 但是当我将其打印到屏幕上时 它充满了大量无用的 html 我可以得到错误吗
  • 在 JavaFX 中使用多个选择框来过滤列表视图

    我正在尝试使用多个选择框为我的列表视图创建一个过滤器函数 但我不知道如何做到这一点 因为我对 JavaFX 还很陌生 我做了一些研究 听说需要使用过滤列表 但大多数在线示例仅围绕使用文本字段 这是我的控制器类 FXML private Ch
  • 如何使 tf.data.Dataset 在一次调用中返回所有元素?

    有没有一种简单的方法来获取整个元素集tf data Dataset 即我想将数据集的批量大小设置为我的数据集的大小 而无需专门向其传递元素数量 这对于验证数据集非常有用 我想一次性测量整个数据集的准确性 我很惊讶没有一种方法可以获取 a 的
  • 在 Jenkins for Git 中管理 SSH 密钥

    我正在尝试让 Jenkins 启动并运行 GitHub 托管存储库 使用 Jenkins Git 插件 该存储库有多个 git 子模块 因此我不确定是否要尝试管理多个部署密钥 我的个人 GitHub 用户帐户是我希望使用 Jenkins 参
  • 软件导致连接中止。回复返回错误:连接无效

    My Xcode 9 gives the message to which I don t know how to respond I want to run the app to my simulator and I am getting
  • 在 Angular 2/Angular-CLI 中将 CSS 排除在 JS 之外

    默认情况下 Angular 2 将 CSS 编译为 JavaScript 尤其是在 Angular CLI 中使用 WebPack 时 我宁愿这种情况不要发生 原因有几个 第一个原因是 当我开发时 我发现能够在开发人员工具中准确地看到特定样
  • 如何管理缓存的IDisposable对象?

    我有一个创建成本很高的对象 它使用一些非托管资源 这些资源在完成后必须显式释放 因此实现 IDisposable 我想要一个缓存 例如这些昂贵的资源 以便最小化创建成本 但我不知道如何处理处置 如果使用对象的方法负责处置 那么我最终会在缓存