问题标签 [finalizer]

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 投票
6 回答
3740 浏览

c# - 终结器和处置

我有一个名为的类BackgroundWorker,它有一个不断运行的线程。要关闭这个线程,一个名为stopto 的实例变量需要是true.

为了确保在使用完类时释放线程,我添加IDisposable了一个调用Dispose(). 假设stop = true确实会导致该线程退出,那么这个 sippet 是否正确?Dispose从终结器调用很好,对吗?

Dispose如果object继承,终结器应该总是调用IDisposable,对吗?

0 投票
8 回答
12871 浏览

c# - 如果构造函数抛出异常,是否调用析构函数?

寻找 C# 和 C++ 的答案。(在 C# 中,将“析构函数”替换为“终结器”)

0 投票
4 回答
1948 浏览

ruby - Ruby 中的 RAII(或者,如何在 Ruby 中管理资源)

我知道这是设计使然,您无法控制对象被销毁时会发生什么。我也知道将一些类方法定义为终结器。

但是,C++ 的 RAII 的 ruby​​ 习语是(资源在构造函数中初始化,在析构函数中关闭)吗?即使发生错误或异常,人们如何管理对象内部使用的资源?

使用确保工作:

但是该类的用户必须记住每次需要调用 open 方法时 都要执行整个 begin-rescue-ensure chacha 。

例如,我将有以下课程:

如果异常是由其他类引起的并且脚本退出,则不会关闭 resource_handle。

还是更多的问题是我仍然在做这件事太像 C++?

0 投票
1 回答
1955 浏览

.net - 终结器线程的范围是什么 - 每个应用程序域或每个进程?

根据我所有的阅读,应该有一个 GC 线程来调用所有终结器。现在,问题是这个“一个”线程的范围是什么——每个进程或每个应用程序域,因为域的全部意图是在一个进程空间中分离并制作“独立”的不同应用程序。

我在这里读到:

如果在终结器中发生未处理的异常,CLR 的执行线程将吞下该异常,将终结器视为正常完成,将其从易碎队列中删除并移至下一个条目。

更严重的是,如果你的终结器由于某种原因没有退出会发生什么,例如它阻塞,等待一个永远不会发生的条件。在这种情况下,终结器线程将被挂起,因此不再有可终结的对象被垃圾收集。您应该非常了解这种情况,并坚持编写最简单的代码来释放终结器中的非托管资源。

另一个考虑因素是应用程序关闭期间会发生什么。当程序关闭时,垃圾收集器将努力调用所有可终结对象的终结器,但有一定的限制:

  • 在关闭期间,可终结对象不会提升到更高的堆代。

  • 任何单独的终结器将有最多 2 秒的时间来执行;如果需要更长的时间,它将被杀死。

  • 所有终结器的执行时间最长为 40 秒;如果此时任何终结器仍在执行或未决,则整个过程会突然终止。

太多帖子(甚至官方文档)滥用术语“应用程序”、“进程”和“应用程序域”——其中大多数甚至假设它们是相等的,因为通常应用程序在单个进程中的单个应用程序域中运行. 这种滥用使所有这些文档都难以阅读,甚至没有用处。

因此,我的问题假设有多个应用程序,每个应用程序都在单个进程的单独应用程序域中运行。

所有这些应用程序是否共享相同的 GC 和终结器线程?上面文章中描述的问题(挂起终结器线程)会影响该进程中的所有应用程序吗?如果是 - 是否有解决方法(除了不使用不良应用程序),例如以某种方式发现终结器线程并将其发送 Thread.Abort?

以上都是因为我遇到了类似的问题。我的应用程序作为第三方软件 (Outlook) 的插件在单独的应用程序域中运行。由于各种原因,我需要调用 GC.Collect 和 GC.WaitForPendingFinalizers 来完全释放 COM 引用(通常的互操作例程对于 Office/Outlook 来说是不够的),当某个特定的其他第三方插件运行时,我的 GC.WaitForPendingFinalizers 永远挂起,所以我怀疑第三方添加中有一个“坏”的终结器。我无法控制替换/删除添加(客户的要求),所以我必须自己弄清楚如何使它们共存。

0 投票
5 回答
16561 浏览

c# - 静态终结器

执行某些静态终结的正确方法是什么?

没有静态析构函数。该AppDomain.DomainUnload事件不会在默认域中引发。该AppDomain.ProcessExit事件在所有事件处理程序之间共享三秒(默认设置)的总时间,因此它不是真正可用的。

0 投票
4 回答
4235 浏览

.net - 如何识别 GC Finalizer 线程?

我有一个 .NET (C#) 多线程应用程序,我想知道某个方法是否在 Finalizer 线程中运行。

我试过使用 Thread.CurrentThread.Name 但它不起作用(返回 null)。

任何人都知道如何查询当前线程以发现它是否是终结器线程?

0 投票
5 回答
1538 浏览

python - Python:通过终结器在程序终止之前刷新缓冲区

我保留事务缓存以在水印或对象完成的事件中刷新(到持久存储)。由于不再保证在每个对象上都被调用,因此将类似函数(或自身)挂接到(在初始化期间)的适当方法__del__是什么?__del__atexit.register

如果我没记错的话,这导致该方法绑定到的对象一直存在,直到程序终止。这可能不是问题,但也许有更优雅的解决方案?

注意:我知道 using__del__是不理想的,因为它可能会导致无法捕获的异常,但我想不出另一种方法来做这件事,除非finalize()在我的程序中一直进行级联调用。蒂亚!

0 投票
3 回答
4418 浏览

c# - 处理套接字/完成两次的问题?

我正在为一个打开套接字,发出请求并监听响应的类使用一些代码(不是我的,我急于添加,我一点也不信任),它以我可以的方式抛出异常在 xunit 中测试时不理解。我假设同样的异常发生在“现场”,但是该类被一个单例引用,所以它可能只是被隐藏了。

问题在 xunit 中表现为“System.CannotUnloadAppDomainException: Error while unloading appdomain”,内部异常是在关闭套接字时(基本上)在终结器内抛出“System.ObjectDisposedException”!没有其他对调用 close 和 dispose 的套接字的引用在 Socket 类上受到保护,所以我不清楚如何处理该对象。

此外,如果我只是捕获并吸收 ObjectDisposedException,xunit 会在它到达关闭侦听器线程的行时终止。

我只是不明白在要求关闭之前如何处理 Socket。

我对套接字的了解只是我发现这个问题后学到的知识,所以我不知道我是否提供了 SO 可能需要的一切。LMK 如果没有!

0 投票
4 回答
933 浏览

c# - 需要在使用 TcpClient 的类上实现终结器?

我有一个MyClass使用(作为私有字段)TcpClient对象的类(比如说)。MyClass实现方法中的IDisposable调用。TcpClient.CloseDispose

我的问题是MyClass还应该实现一个终结器来调用Dispose(bool Disposing)以释放TcpClient’s非托管资源,以防MyClass.Dispose调用代码不调用它?

谢谢

0 投票
3 回答
1536 浏览

c# - 为什么在这个非常简单的场景中没有调用我的 .net 析构函数?

我有以下代码:

我认为我的 Finalizer 方法会在我调用 GC.Collect 时被调用,但事实并非如此。

谁能解释我为什么?