调用Dispose不会清理对象C#使用的内存? [复制]

2023-12-24

直觉告诉我,Dispose 旨在用于运行用户定义的代码,这些代码会释放不会自动释放的资源,例如文件句柄、网络句柄、数据库连接等。

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

他还说

请注意,.NET 垃圾收集器是非常不可预测的,它可能会在清理所有符合收集条件的旧实例之前创建对象的一些实例。一种确定的方法(无需借助内存分析器)是在终结器中放置一个断点。

我通过上面的GC相关代码释放内存并收集所有未声明的对象或对象超出范围。

他还说永远不要在生产环境中使用上面的 GC 相关代码,但没有解释原因......所以告诉我如果有人使用下面这些 GC 相关代码会有什么危害GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();

无论如何,寻找深入的知识。谢谢


GC从不打电话Dispose方法,只要您在终结器中手动执行此操作

的工作流程GC很简单,但是很多人都感到困惑,让我们把东西放在他们的位置上

Dispose不相关GC. Dispose是一个方法,在接口中定义IDisposable,与其他接口一样,类可以实现该方法并让用户能够调用该方法。 GC根本不关注这个接口。 一旦我们在.NET中有自动内存管理,并且我们知道GC很好地完成了他的工作,它会自动清除所有托管资源,因此没有理由向用户提供Dispose清除托管资源的方法。因此,通常 Dispose 用于清除非托管资源,但没有人阻止您取消订阅全局事件作为示例,或者为嵌套对象调用 Dispose(请注意,全局事件几乎总是不好的做法:))

另一方面,GC知道Finalizer, 而如果Finalizer exists GC将对象处置推迟到下一次收集,然后调用Finalizer清除内存之前。为了将配置代码放在一处,程序员通常创建Dispose(bool)并从调用此方法Finalizer and IDisposable.Dispose方法。这里您需要注意,如果调用来自 Finalizer,则不允许您访问托管资源,因为 GC 不保证任何处置顺序,并且该资源可能已经处于无效状态。这就是所谓的处置模式 http://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx.

关于生产中的 GC 调用,是的,不建议这样做,因为一般 GC 的工作都很好,而且由于 GC.Collect 是昂贵的操作,因此在我们决定进行自动收集之前,没有理由为 GC 引擎烦恼。

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

调用Dispose不会清理对象C#使用的内存? [复制] 的相关文章

  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 从 C# 向 PLC 发送 FINS 命令

    我尝试发送FINS命令通过 UDP 从 PC C NET 发送到 PLC 以太网模块 Omron 但没有从 PLC 得到任何响应 并且不知道从哪里可以开始故障排除 PLC has a very simple ladder logic as
  • Kotlin arrow-kt 扁平化嵌套 任一

    我正在使用函数库进行编程arrow kt 原名kategory 我在用着Eithermonad 用于聚合 api 调用的错误或成功信息 我让自己陷入了一种我有嵌套的状态 这本来就不应该发生 Either单子 我试图扁平化结构以获得内部单子
  • 使用子进程打开 Windows 快捷方式文件“.lnk”

    我对 Python 相当陌生 一直在尝试制作一个程序来为我打开 Minecraft 启动器 Context 然而 新的启动器 exe文件被阻止 因为它位于 windowsapp 文件中 这需要很多我宁愿避免的事情 所以我希望看看是否可以打开
  • 将 Android ADT 工具从 21.0.1 更新到 21.1.0

    我已将 SDK 更新到 21 1 以及如何更新旧版本中的 ADT 21 1 当我打开我的 SDK 时 它显示 此 Android SDK 需要 Android Developer Toolkit 版本 21 1 0 或更高版本 当前版本为
  • 编辑用户出错,临时更改了app.user.username,如何解决?

    我们为用户使用 Symfony2 框架和 FOSUserBundle 所以我们有自己的UserBundle 它继承自FOSUserBundle 问题是 当我们发送用于编辑密码错误的用户的表单时 标头中显示的 app user usernam
  • 在 spring mvc 控制器中使用服务和 DAO

    我正在构建一个 Web 应用程序 主要由后端 数据库数据的 CRUD 操作组成 在某些情况下 我必须编写业务逻辑 我确信随着我们深入开发 我们将构建更多的业务逻辑 目前 对于我创建的每个 UI 屏幕 我创建一个模型类 Service 类 D
  • 对多个源文件使用一次 #define

    Visual C 中有没有办法在 cpp 文件中 define 某些内容并在其他 cpp 文件中定义它 至少有两个选择 将定义放入头文件中 并将该头文件包含在需要定义的所有源文件中 Use the D编译器选项 http msdn micr
  • Bootstrap 3 将页脚对齐到底部。不固定

    我正在为我正在设计的网站使用 Bootstrap 3 我想要一个像这个示例一样的页脚 Sample http wrapbootstrap com preview WB0B348C6 请注意 我不想修复它 因此 bootstrap navba
  • 我可以在 Action 或 Func 委托中使用参数吗?

    当我尝试在操作委托中使用参数时 private Action
  • Eclipse 安装软件显示“无法完成请求”

    我正在使用 Eclipse Luna Service Release 1 4 4 1 当我尝试安装新软件时 它给出了一些错误消息 例如Cannot complete the request This installation has not
  • 如何在 UILabel 中换行

    我有一个 UILabel 位于自定义 UITableViewCell 内 我试图将单词包含在 UILabel 内 但是我遇到了一些问题 这是 UITableViewCell 在 Interface Builder 中的外观 UILabel
  • 解决错误:“Timer”是“System.Windows.Forms.Timer”和“System.Timers.Timer”之间的不明确引用

    我正在尝试创建一个 Windows 窗体应用程序 并且我想实现一个计时器 public void timerStart DateTime now DateTime Now DateTime finish base taskEndDate f
  • 用于多个活动的 ViewPager

    我正在尝试实现一个具有多个活动的 ViewPager 我正在关注这个example https github com JakeWharton Android ViewPagerIndicator但这看起来并不使用多个活动 而是使用片段 如果
  • 有没有一种方法无需在 SQL Server 中进行转换即可获取布尔值?

    我发现很奇怪的是 像这样的简单代码无效 select from table where field true 另一种选择显然是 select from table where field true 好吧 我想我可以忍受 由于某种原因 我最近
  • 制作背景图像随按钮大小缩放

    我正在尝试向 Win Forms 应用程序中的几个按钮添加一些背景图像 这三张图像的尺寸不同 即像素尺寸不匹配 一张为 128x128 另一张为 256x256 我需要按钮的大小相同 否则 GUI 会非常不对称 在不更改实际图像文件的情况下
  • 将表达式转换为数据类型日期时间时出现算术溢出错误

    这个 select 语句给出了算术错误消息 SELECT CAST FLOOR CAST LeftDate AS DECIMAL 12 5 AS DATETIME LeftDate FROM Table WHERE LeftDate gt
  • minitest:未定义的方法“get”

    我需要用 minitest 测试我的控制器 我试过了 describe CommentsController do it should get index do get index assert response success end e
  • 用 Java 创建 Excel 文件

    我想创建一个Excel文件并写入数据 就像用Java写入文本文件一样 我尝试更改文件扩展名 txt to xls 但我想将 Excel 文件中的字母加粗 我怎样才能做到这一点 我尝试过使用 JXL API 但每次我必须创建标签时我都不想添加
  • 双射“整数 <-> 字符串”函数

    这是我试图为其创建最佳解决方案的问题 我有一组有限的非负整数 范围为 0 N 我需要能够将这个集合中的每个数字表示为一个字符串 并且能够将这样的字符串向后转换为原始数字 所以这应该是一个双射函数 附加要求是 数字的字符串表示应该至少在某种程
  • 调用Dispose不会清理对象C#使用的内存? [复制]

    这个问题在这里已经有答案了 直觉告诉我 Dispose 旨在用于运行用户定义的代码 这些代码会释放不会自动释放的资源 例如文件句柄 网络句柄 数据库连接等 GC Collect GC WaitForPendingFinalizers GC