如何管理缓存的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对象? 的相关文章

  • 使用.NET 访问Windows 注册表?

    我发现一个奇怪的行为 NET http en wikipedia org wiki NET Framework模块访问Windows注册表 http en wikipedia org wiki Windows Registry使用Regis
  • 从另一个命令 Handle() 方法中调用命令

    嗨 我正在使用简易注射器 https simpleinjector orgDI 库并一直在关注一些关于围绕命令模式设计的架构模型的非常有趣的材料 同时 在我的架构的命令方面 https cuttingedge it blogs steven
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • Java8流操作有缓存吗? [复制]

    这个问题在这里已经有答案了 我在我的电脑上运行了下面的示例代码Intel R Xeon R CPU E5 2680 0 2 70GHz 2 CPUs 2 7GHz String format 7s run taken 6d micro se
  • 如何更改字体的元数据(特别是标题)?

    我需要一种动态更改字体名称的方法 但在 net 中找不到这样做的方法 我不关心字体文件类型 所以otf fon ttf都打开 我尝试过的事情 使用 dsofile dll OleDocument 属性读取器 这些与访问字体名称的任何内容所使
  • csc.exe 引用外部 .dll 文件

    我正在尝试做一个简单的c 程序使用Growl C API 我尝试用两种不同的方式编译我的程序 我保留了我的 dll文件与我的在同一目录中 cs文件 比我跑的 csc r Growl Connector dll Growl CoreLibra
  • Mathematica 中的数据缓存

    有一个非常耗时的操作在我的包中生成数据集 我想保存此数据集 并仅在我手动删除缓存文件时才让包重建它 这是我的方法作为包的一部分 myDataset Module fname data fname cached data mx If File
  • 在.NET中发送电子邮件,电子邮件保存在用户的已发送邮件中

    我正在尝试使用 VB NET 发送电子邮件 有两个要求 电子邮件将保存在 Outlook 他们唯一的电子邮件客户端 中的 已发送邮件 文件夹中 电子邮件中附有 PDF 动态生成 我目前正在创建一个新的邮件留言 http msdn micro
  • .NET - 用户控件拖放 - 子控件

    我有 FlowLayoutPanel 和用户控件 可以拖放重新排序 这种作品 但问题是子控件阻止拖动实际的父 UserControl 所以我的问题是如何启用包含子控件的 UserControl 的拖动 如果我理解正确的话 我遇到了与您相同的
  • 如何强制网络浏览器不缓存图像

    背景 我正在为两个公益网站编写并使用一个非常简单的基于 CGI Perl 的内容管理工具 它为网站管理员提供了事件的 HTML 表单 他们可以在其中填写字段 日期 地点 标题 描述 链接等 并保存 在该表格上 我允许管理员上传与该活动相关的
  • 如何制作可修补/可更新的应用程序?

    我已经完成了一个学生项目 该项目从互联网上的 xml 文件中提取数据并将其保存到数据库并显示 我以几种不同的方式使用这些数据 例如在主页上显示在另一个选项卡中作为表格 并创建一些图表 我通过制作 5 个不同的类来完成这一切 每个类提取不同类
  • 如何在 Windows 窗体上显示 ClickOnce 版本号

    我有一个部署到两个不同位置的 Windows 窗体应用程序 内联网 ClickOnce Internet 通过 Windows 安装程序安装在 Citrix 场上 我显示单击一次部署版本的 ClickOnce 版本号ApplicationD
  • Portable 和 win-x64 在部署时有什么区别?

    我将代码部署到 Windows Server 2016 上的 IIS 我试图了解选择之间的有效区别Portable vs win x64在发布 设置 目标运行时下拉列表中 由于 JIT 需要将代码编译到特定的体系结构 站点在 Portabl
  • 如何在 C# 中知道 PID 和 VID 来发现虚拟 COM 端口名称

    如果我知道 PID 和 VID 我会尝试找到查找 COM 端口名称的正确方法 到目前为止 我写了解决方法 但我不相信没有更优雅和正确的方法 顺便说一句 我知道我可以使用 REGEX 编写此代码只是为了测试解决方法 我知道还有很大的改进空间
  • 本机线程异常会毫无例外地导致 .Net 应用程序崩溃

    我发现了一种情况 我的 Net 应用程序会意外崩溃 而不会引发任何异常 我希望 至少 AppDomain UnhandledException在这种情况下工作 以便至少使我能够记录错误并向用户提供一些信息 在这种情况下 我有一个 Net 程
  • 从类外部调用某些异步方法时出现异常

    假设我有一个名为 x 和 y 的类 如下所示 class x public x p private async p await q private async p some logic is there 在 test aspx cs 文件中
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编

随机推荐

  • 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 我想要一个缓存 例如这些昂贵的资源 以便最小化创建成本 但我不知道如何处理处置 如果使用对象的方法负责处置 那么我最终会在缓存