Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#表单应用程序中的内存泄漏_C#_.net_Forms_Memory Leaks - Fatal编程技术网

C#表单应用程序中的内存泄漏

C#表单应用程序中的内存泄漏,c#,.net,forms,memory-leaks,C#,.net,Forms,Memory Leaks,我有一个类,根据某个事件,我初始化一个新的基于表单的对话框,然后初始化它。此基于表单的对话框中有其他控件 当对话框关闭时,我会清除并释放表单中创建的所有控件。不幸的是,似乎有些东西没有被处理掉,甚至在移除之后也没有留在内存中 成型泵 class someClass { System.Timers.Timer someTimer; public void CallToChildThread(Object stateInfo) { // check some e

我有一个类,根据某个事件,我初始化一个新的基于表单的对话框,然后初始化它。此基于表单的对话框中有其他控件

对话框
关闭时,我会清除并释放表单中创建的所有控件。不幸的是,似乎有些东西没有被处理掉,甚至在移除之后也没有留在内存中

成型泵

class someClass
{
    System.Timers.Timer someTimer;
    public void CallToChildThread(Object stateInfo)
    {
       // check some event
      // if true, fire event
    }
    someClass()
    {
          someTimer= new System.Threading.Timer(CallToChildThread,
                                   autoEvent, 1000, 250);
            _show += new EventHandler(eventCheck);
    }
    void eventCheck()
    {
        formClass formClassObject = new formClass(); //create form
        formClassObject.someFunction(); // has some other function and does a showDialog on self
        formClassObject.Dispose();
        formClassObject = null;
    }
}
在formClass对象内部,在获取FormClosed事件时,我会处理掉对象中控件中的所有控件和控件,但仍然存在明显的内存泄漏

表单类

public partial class formClass
{
    //Initialize a bunch of managed  resources to null
    someOtherForm form2;
    someOtherForm form3;
    //connect some events on child forms to buttons on this form object
    this.form2.cancelButtonClicked += someFunction;
    this.form3.cancelButtonClicked += someFunction;
    // Form closed Event
    private void formClass_FormClosed(object sender, FormClosedEventArgs e)
    {
        //set form2 and form3 visibility to false
        // clear AND dispose all controls of form2
        // clear AND dispose all controls of form3
        //set form2 and form3 to null
        // clear AND dispose off all controls of formClass 
        // Dispose this (formClass) object
     }
}
初始化表单对象的方式是否存在可能的问题?那些人没有被处置吗?

请看这里:


在处理之前,请尝试删除事件处理程序(_show),以便真正处理子窗体内存。

您没有删除事件处理程序,这可能是泄漏源。 可能您应该将someClass设置为一次性的,并删除Dispose方法中的处理程序

如何确认是否存在泄漏?垃圾收集器可能会延迟运行,给人一种内存未被收集的感觉。您可以在每次处理表单后显式调用gb,并查看发生了什么:

formClassObject.Dispose();

GC.Collect();  
GC.WaitForPendingFinalizers();  
GC.Collect();  
GC.WaitForPendingFinalizers();
其他一些提示:

您创建的表单可能会引发异常,并且无法正确处理。 由于您创建了模式对话框(调用ShowDialog),因此应使用使用模式

using (formClass formClassObject = new formClass())
{
   formClassObject.someFunction();
}
您可以使用.NET探查器对泄漏进行故障排除

请参阅本帖,了解其他选择:


为什么您认为内存泄漏?请注意,垃圾收集自行决定何时实际释放内存。这不一定是立即发生的,但最终可以在gc发现没有足够的内存来完成下一个分配请求时完成。顺便说一句:如果你处理表单,它将自行处理其所有控件,无需手动执行此操作。什么行为会让你认为存在内存泄漏?尝试处理计时器和表单对象?你没有处理。因为它不在表单中,如果你创建
someClass
(不清楚你有多少个)的实例,它们都会保留下来,甚至更糟的是会继续触发事件。你从哪里看到内存显著增加?您使用的是内存分析器吗?我想是有漏洞的,因为每次我触发一个创建新窗体并初始化控件的事件时,内存都会显著增加。另外,应用程序的任务管理中的用户对象计数器将上升。如果我打开10个表单,内存会增加很多,用户对象也会增加很多,但是即使我关闭了所有表单,内存也不会下降,不管我让应用程序运行多长时间。用户对象计数下降了一点,但仍然很高。我认为这可能是UI的数据源的问题,但是所有对象和控件都是管理的,并且应该使用表单closure,因为它是有意义的。可能您可以使用.NET探查器或者通过逐渐减轻表单类的工作量(如果可能的话),来解决这个问题。如果检测到大内存泄漏,通常是未正确处理的数据源(正如您已经怀疑的那样)。。。事件如何影响formClass的对象?它只是someClass中的一个事件(它不是一个表单),当计时器中的条件满足时,会发出信号。另外,如果我处理掉这个事件,\u show,那么稍后计时器会发出什么信号?@user1173240我不确定,因为我没有看到您的
表单。在您的响应中有someFunction
方法,但要正确检测问题,我需要查看整个
formClass
对象。处理或关闭表单只会删除UI元素。如果在
formClass
中有任何变量、对象、事件处理程序等,则需要在所有对象本身上设置表单调用
.Dispose()
FormClosed
事件。这是我在没有看到所有代码的情况下的最佳猜测。我添加了一些代码,基本上描述了我在formClass formClosed事件中所做的事情。