Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Can';在C#Winforms中找不到内存泄漏_C#_Winforms_Memory Leaks - Fatal编程技术网

Can';在C#Winforms中找不到内存泄漏

Can';在C#Winforms中找不到内存泄漏,c#,winforms,memory-leaks,C#,Winforms,Memory Leaks,我知道我有内存泄漏。我正在用Winforms用C语言写东西。基本上,我的程序有很多按钮。计时器类每隔.01秒调用一个函数,从gps接收gps数据。每次按下一个按钮,它就会与最新的gps点配对,并被推送到数据库。我不知道漏洞在哪里。它可能与事件处理程序有关吗?每个按钮都有一个+=但从来没有一个-=。或者,当我将gps点发布到gui时,它是否会出现?我正在用实体框架写数据库 谢谢 杰西 编辑: 我知道这是内存泄漏,因为当我进入任务管理器时,我看到我的程序使用的内存一直在增加。而且,计时器不会经常启动

我知道我有内存泄漏。我正在用Winforms用C语言写东西。基本上,我的程序有很多按钮。计时器类每隔.01秒调用一个函数,从gps接收gps数据。每次按下一个按钮,它就会与最新的gps点配对,并被推送到数据库。我不知道漏洞在哪里。它可能与事件处理程序有关吗?每个按钮都有一个+=但从来没有一个-=。或者,当我将gps点发布到gui时,它是否会出现?我正在用实体框架写数据库

谢谢

杰西

编辑: 我知道这是内存泄漏,因为当我进入任务管理器时,我看到我的程序使用的内存一直在增加。而且,计时器不会经常启动,时间越晚,从0.01秒到0.5秒。在自动生成的代码中,每个按钮都已订阅(最后一行):
this.commentsGoButton.Location=新系统.图纸.点(348,23);
this.commentsGoButton.Name=“commentsGoButton”;
this.commentsGoButton.Size=新系统.Drawing.Size(67,70);
this.commentsGoButton.TabIndex=12;
this.commentsGoButton.Text=“输入注释”;
this.commentsGoButton.UseVisualStyleBackColor=true;
this.commentsGoButton.Click+=newsystem.EventHandler(this.commentsGoButton\u Click)

另外,我调用此函数:

        GPS gps1 = new GPS(Lat, Longi, Alt, Yaw, Pit, Rol); 
        info.takeInGPS(gps1);
        str = Lat + "   " + Longi + "   " + Alt + "   " + Yaw + "   " + Pit + "   " + Rol + "   ";
        gui.addToTextBox(str);
GPS是我呼叫它的班级。GPS是从GPS获取点的类。它由GUI类中的计时器调用。GPS将其传递到info以传递到数据库,并使用GUI类发布:

    public void addToTextBox(string s)
    {
        textBox.Text += s += "\r\n";
        textBox.SelectionStart = textBox.TextLength; //scrolling stuff
        textBox.ScrollToCaret();
    }
信息是这样做的:

public void takeInGPS(GPS g)
{
gps=g;
写入(gps);
}


哪些第三方程序会指出内存泄漏的位置?我每秒创建100个新的GPS对象这一事实会成为问题吗?我不是在覆盖它们吗?

如果确实存在内存泄漏,您可能需要使用内存探查器来帮助查找内存泄漏。我在过去发现的一个有用的工具是免费的。你也可以下载它的。它将为您提供内存分配位置的图片,以及每种类型分配了多少内存。它很容易使用


我在其他地方看到的另一个是,但这一个不是免费的(除了试用版)。

在你的帖子中没有真正叫嚣“内存泄漏”的内容。进程的内存使用可能会因为其他原因而逐渐增加,例如对象等待垃圾回收

从您的问题中不清楚有多少数据库访问正在进行,以及“数据库访问”在本例中的确切含义。您可能需要确保数据库更新是在处理UI内容的线程之外的单独线程中进行的。虽然可以从UI线程调用数据库,但这通常不是一个好主意。这可能是导致你减速的原因

您还应该确保您的GPS访问也在您的UI代码的单独线程中。每秒创建100个新对象不太可能导致内存问题,但请记住,任何访问某种硬件的调用可能需要比预期更长的处理时间


最后一件事。。。为什么你要每秒读取(或尝试读取)GPS设备100次?我想不出哪种情况有什么意义。据我所知,一个典型的GPS设备每秒只更新1-5次。更频繁地阅读并不能提供更好的结果。

您是否清除过文本框中的文本,或者只是一直附加到文本框中?每次向下一个框中添加一个长度为M的新条目,并且该条目已经有一个长度为N的字符串时,它将在执行连接时创建一个长度为N+M的新字符串。如果此更新非常频繁,并且您从未清除文本框,则会不断累积分配的内存(其中大部分内存将符合收集条件,但您仍将看到内存使用量的增长。)

要测试这一点,请尝试替换文本而不是附加文本,看看这是否会改变您观察到的结果。

My To a为您提供了各种分析选项


如果您使用这些工具,您应该能够找到可疑内存泄漏发生的位置,并进行代码更改以解决这些问题。

是的,它可以是任何地方的任何东西。您可以通过调试来检查这一点。如果没有代码,我无法向您提供更多信息。一些您认为可能存在问题的示例代码可能会有所帮助。您是否正在积极使用
using
语句来处理对象?我建议使用内存探查器-它应该有助于说明问题。
我知道我有内存泄漏
。你是如何得出这个结论的?另一个很好的选择是。它不是免费的,但有试用期。我正在描绘一条路。实际上,10-20Hz就可以了。我不熟悉线程…问题只会在10分钟后发生。这大大减少了内存使用量的增长。它仍在增长,但速度要慢得多…谢谢你的想法。