当前位置: 首页 > 编程语言 > C#

为什么我的析构函数永远不会运行?分享

时间:2023-04-10 18:34:16 C#

为什么我的析构函数永远不会运行?我有一个带有析构函数方法的空白Winform公共部分类Form1:初始化组件();}~Form1(){System.Diagnostics.Trace.WriteLine("Form1.Dispose"+this.GetHashCode().ToString());当表单被销毁时,我希望它写入输出窗口:(Form1isopen)Form1.Initialize41149443(Form1isclosed)Form1.Dispose41149443MSDNsuggests3waystoimplementthedestructor:然而,这些都不是方法会将“Form1.Dispose41149443”写入输出窗口。所以我无法判断表格是否已被破坏。建议?由于垃圾收集器的不确定性,我是否应该放弃实现这一目标的希望?还有另一种方法可以知道Form1是否已被垃圾收集吗?实现您列出的析构函数的三种方法中只有一种实际上涉及析构函数,那就是~Destructor()。如果您实现IDisposable并处置您的对象,那么Dispose的代码将运行,但没有理由认为您的析构函数会运行。我认为你正在追逐不可能的事情。析构函数在垃圾收集器如此命令时运行。这不是你能控制的。GC完全有权认为运行析构函数只是浪费时间,如果有足够的内存,它就会这样做。如果您需要可预测的处理、完成等,请使用IDisposable。除非您正在研究垃圾收集,否则您不需要跟踪析构函数。您应该查看Dispose(可以在Form中覆盖)。这发生在非托管资源(例如窗口句柄)被释放之后。保护覆盖无效处置(布尔处置){base.Dispose(处置);如果您想查看窗体/控件是否已被释放,请使用Control.IsDisposed属性。编辑:由于GC.SuppressFinalize,如果您显式调用Dispose(或通过框架),您的Finalize方法(C#中的析构函数语法)将永远不会执行。有关详细信息,请参阅实施Dispose方法。是的,你应该放弃析构函数的想法,因为它们本质上是不确定的。我不确定为什么您需要处理表单而不是关闭它,但在大多数情况下只需关闭它就足够了。您可以使用IDisposable但这取决于您需要对表单进行垃圾回收的原因。如果您需要重用它,只需创建另一个实例即可。当不存在引用并且垃圾收集器恰好运行时,表单将被垃圾收集。您可以通过调用GC.Collect()强制垃圾收集器。您不应在终结器(也称为析构函数)中引用任何其他对象,因为该对象可能已被垃圾回收。如果确实需要,您可以使用内存分析器工具来确定您的对象是否被垃圾回收。您还必须记住终结器是从主线程以外的线程调用的。编辑:如果您的问题只是您没有看到跟踪输出,您可能必须打开自动刷新编辑2:您的表单可能有外部引用,例如已注册的事件处理程序。我建议你在你的应用程序的管理区添加一个按钮来执行下面的代码:GC.Collect();GC.WaitForPendingFinalizers();GC.收集();像这样,垃圾收集器必须运行并且应该销毁您的表单(在终结器中设置断点)。如果不是,则您引用了一些必须销毁的对象。将FormClosed事件添加到设计器。即:this.FormClosed+=newSystem.Windows.Forms.FormClosedEventHandler(Form1_FormClosed);然后创建适当的函数来处理事件。您可以尝试将表单包装在WeakReference对象中,然后检查其IsAlive属性以查看它是否已被垃圾回收。但是是的......根据其他答案,你最好离开它并相信GC来完成它的工作!以上是C#学习教程:为什么我的析构函数一直运行不起来?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: