问题标签 [finalize]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1562 浏览

c# - 最终确定 C# 中的方法指南和最佳实践

我最近遇到了一个与在 Finalize 方法重载中运行的代码有关的问题。

我主要了解与内存管理/性能相关的问题,但我很感兴趣是否有任何关于“哪些代码应该/不应该进入 Finalize 方法”的指导方针?

例如:

  1. 不要从 Finalize 方法中抛出异常。
  2. 代码应该快速执行。
  3. 不要引发事件(?)
  4. ETC...

由于引发了导致某些异常的事件,因此可以看到我的情况。

所以我的问题是——关于最终确定方法,我必须遵循哪些准则(甚至可能使用某些工具强制执行)?

0 投票
2 回答
213 浏览

c# - “使用”语句中的灾难性故障,即 using(var a= new stream()) 和 a.Something() 引发异常

所以我知道在 using 块语句的末尾,调用了 dispose 方法。

如果我使用'using(var a = new Stream()) { a.SomethingThrowsAnException() }'

流是否仍然通过他的处置方法?

我编写了一个实现 IDisposable 的类,它是关键任务,我不会丢失内存中的内容,因此我计划在发生灾难性事件时序列化数据,即我有一个自定义流,如我正在使用的对象。

有什么建议么?

谢谢。

0 投票
1 回答
173 浏览

.net - 在单元测试中检测 finalize 异常

有没有办法强制在单元测试期间创建的所有对象完成?我一直遇到的问题是,由于丢失GCHandle实例而导致的任何泄漏似乎只有在进程本身(而不是AppDomain!)终止时才最终确定,这是在程序集中的所有测试都已运行(并且可能“通过”)之后。

我在 C# 中最好但不够的尝试:

运行这将导致“通过”测试,但会通知后台线程有未处理的异常。在具有多个测试的装配中,这不太理想。

0 投票
1 回答
669 浏览

c# - 为什么 MSDN 提到要覆盖 Finalize() 方法?

自从我第一堂关于 C# 类的课程以来,我了解到不仅我不能Finalize()显式调用类的方法(它由垃圾收集器调用),而且我什至不允许在我的自定义类中实现它。
让我有点困惑的是,在MSDN中就像这里 -

By default, the Object.Finalize method does nothing. If you want the garbage collector to perform cleanup operations on your object before it reclaims the object's memory, you must override this method in your class.

我发现很多地方都暗示了别的东西。谁能澄清这是为什么?

0 投票
1 回答
510 浏览

c# - 确保线程终止时“最终”在同一线程上运行

这里有一个谜题给你们。我有一个多线程程序,其中一些线程使用锁和信号量等托管资源。某些锁定释放原语只能从完成锁定获取的同一线程执行。

所以这是我的难题:我包装了这些类型的操作:try { lock-acquire... do something } finally { lock-release },但有时当我的线程终止时,finally 子句由 .NET 垃圾收集线程执行,并且不是我的线程。(具体情况实际上涉及到在“using”语句中分配的对象的Dispose;详情见下文)

演示有点棘手;我一直在 Isis2 中看到它,我通过检查获取和完成块中的线程 ID 发现这是发生的。但是我没有适合你的 3 行演示,对此我很抱歉。我知道这会使提供帮助变得更容易。

有没有一种方法可以延迟线程的终止,直到与该线程关联的所有挂起的 finalize 块都已执行?

---- 为 Mark 添加了详细信息 ----

我真正在做的是一个相当复杂的自我检测锁定包,它具有各种具有线程优先级的锁定抽象(有界缓冲区、障碍、普通锁等),旨在自我检测死锁、优先级反转、非常慢的锁定授予和其他问题。我的代码足够复杂并且线程足够多,因此我需要它来调试它。

我的基本构造风格的一个例子是:

LockObject 是一个自我监控锁...... LockAndElevate 会记录我锁定它(在这种情况下),然后在我解锁它时跟踪处置。因此,我正在利用这样一个事实,即 using 应该在块完成时处理新对象——即使它抛出异常。

我看到的是,线程经常终止,但使用 dispose 事件实际上并没有发生;他们稍后在其他线程上运行。这只发生在我的一个线程终止时;在正常执行中,整个事情就像一个魅力。

因此,由于使用 translates 来尝试... finally,我的问题是根据 finally 子句发布的。

0 投票
5 回答
14200 浏览

java - 如何确保始终调用 finalize()(Java 练习中的思考)

我正在慢慢研究 Bruce Eckel 的Thinking in Java 4th edition,以下问题让我很困惑:

创建一个带有 finalize( ) 方法的类,该方法打印一条消息。在 main( ) 中,创建你的类的一个对象。修改前面的练习,以便始终调用您的 finalize()。

这是我编码的:

它创建一个Horse布尔值inStable设置为的新对象false。现在,在该finalize()方法中,它检查是否inStablefalse。如果是,它会打印一条消息。

不幸的是,没有打印任何消息。由于条件评估为true,我的猜测是它finalize()一开始就没有被调用。我已经多次运行该程序,并且只看到错误消息打印了几次。我的印象是,当System.gc()被调用时,垃圾收集器将收集任何未引用的对象。

谷歌搜索一个正确的答案给了我这个链接,它提供了更详细、更复杂的代码。它使用我以前从未见过的方法,例如System.runFinalization()Runtime.getRuntime()System.runFinalizersOnExit()

有没有人能让我更好地理解它是如何finalize()工作的以及如何强制它运行,或者让我了解解决方案代码中正在做什么?

0 投票
2 回答
1599 浏览

c# - 如何在 C# 中使用 DeviceIoControl 和 FSCTL_MAKE_MEDIA_COMPATIBLE 完成 Live File System (LiveUDF) 光盘?

我正在尝试用 C# 完成 Live File System(或“Live UDF”)光盘。根据我阅读 MSDN 和 TechNet 文章以及各种论坛帖子的了解,Image Mastering API(或 IMAPI)不支持这种类型的文件系统,并且在我的编码工作中,我未能成功使用 IMAPI 完成 LiveUDF 光盘。因此,我使用了 FSCTL_MAKE_MEDIA_COMPATIBLE 控制代码的 DeviceIoControl 函数。

首先,我正在同步调用 DeviceIoControl,但该函数将返回 1117,并且磁盘最终会在几分钟后完成。这种结果是不可接受的,因为我需要该过程仅在最终失败或实际成功时返回。

接下来,我通过使用带有 FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes 标志的 CreateFile 打开设备句柄并将 NativeOverlapped 对象传递给 DeviceIoControl 调用,继续异步调用 DeviceIoControl。在此之前,很明显,我设置了一个 IOCompletionCallback 来处理任何重叠事件。

如上所述异步调用 DeviceIoControl 时,它仍然几乎立即返回 1117(就像同步调用时一样),永远不会调用 IOCompletionCallback 方法,并且磁盘会在几分钟后完成。

我的问题是:如何在 Windows 7 平台上使用 C# 和 DeviceIoControl(同步或异步,能够“等待”其进程完成)完成 C# 中的 Live File System(或“Live UDF”)光盘捕捉最终的成功或失败结果)?

非常感谢提前。

0 投票
1 回答
1195 浏览

delphi - 如何完成通过函数的无类型参数传递的记录?

我可以将“任何”记录类型传递给我的程序吗?

很多时候,我将“记录”与字符串一起使用。

要清除它们,我需要写:

问题是我如何通过任何类型的记录来清除它?

为此,我得到了这个提示:“表达式不需要初始化/完成”。

感谢您提供的每一个信息!

0 投票
1 回答
289 浏览

java - Java 终结器方法和 GC

我创建了一个对象,该对象的 finalize 方法已被覆盖,以使用一些信息保存和关闭文件。该对象被另一个对象弱引用。我想在 GC 发生时保存对对象的一些更改。这就是为什么我覆盖了 finalize 的代码。

但是,当对象即将被垃圾回收时,会调用 finalize 方法。这可以在它有资格进行垃圾收集之后的任何时间。

我不想要这个,我想在 GC 发生后立即调用 finalize 方法,并且不应该有任何延迟。我可以设置任何 jvm 选项来实现这一点吗?我只能看到另一种方式是“System.runFinalization()”,但这似乎很俗气??有没有更优雅的方式?

谢谢

0 投票
4 回答
83 浏览

java - 我怎么能调用 finalize()

在下面的代码中,我得到了输出 Hello。谁能解释为什么编译器没有报告错误,因为我在类和继承链之外调用了一个受保护的函数。

谢谢。