gpt4 book ai didi

c# - 内存是否在 Form.close() 上释放?

转载 作者:太空狗 更新时间:2023-10-30 00:24:13 26 4
gpt4 key购买 nike

我正在开发具有大量表单打开和关闭操作的反馈应用程序。当我启动我的应用程序需要 25 MB 时,我注意到我的应用程序中的内存变化很少。用户每给它一个反馈,它就会增加 3 MB 的内存使用量。在每一种形式上,当它从一个跳到另一个或有任何关闭操作时,我都使用过 this.close() 。内存增加的可能原因是什么。

我是否需要手动调用垃圾收集器,因为每个人都说这不是好的做法。

在此我使用双显示器场景,其中应用程序每 500 毫秒拍摄一次辅助屏幕快照并将其显示在主屏幕上。为此,我使用如下所示的代码:

public EntryForm()
{
sc = Screen.AllScreens;
dbDms = new HondaDb(UtilityFunctions.getServerConnection());
db = new HondaDb(UtilityFunctions.getClientConnection());
bmpScreenshot = new Bitmap(sc[1].Bounds.Width,
sc[1].Bounds.Height,
PixelFormat.Format32bppArgb);

Create a graphics object from the bitmap.
gfxScreenshot = Graphics.FromImage(bmpScreenshot);
Timer timerClientScreen = new Timer();
timerClientScreen.Interval = 500;
timerClientScreen.Enabled = false;
timerClientScreen.Start();
timerClientScreen.Tick += new EventHandler(timer_TickClient);
}

void timer_TickClient(object sender, EventArgs e)
{

// Take the screenshot from the upper left corner to the right bottom corner.
gfxScreenshot.CopyFromScreen(sc[1].Bounds.X, sc[1].Bounds.Y,
0, 0, sc[1].Bounds.Size, CopyPixelOperation.SourceCopy);
// Save the screenshot to the specified path that the user has chosen.
pictureBoxClient.Image = bmpScreenshot;
}

为了在打开其他表单时关闭表单,我使用下面的代码

formOpen.show();
formClose.Close();

建议我如何节省内存使用量。

最佳答案

确实如此,但只是您的 UI 对象。对于您使用的变量,它不是自动的。在这样的应用程序中,使用占用很少 GC 堆空间但占用大量非托管资源的大对象,垃圾收集器通常不会经常运行以防止您遇到麻烦。您必须帮助并显式处置对象,这样您就不会将其留给 GC 来处理。

它可能需要很长时间才能开始运行,在它开始运行终结器之前,您可能会积累大量非托管内存使用。可能会因 OOM 而使您的程序崩溃,尽管您离该问题还很远。现在你只是跑得“很重”。

为 FormClosed 事件添加事件处理程序。您需要对 gfxScreenshotbmpScreenshot 对象调用 Dispose() 方法。当然,那些 HondaDb 对象也需要某种清理。

不要假设会立即解决内存使用增量,GC 并不急于将地址空间释放回操作系统。保留它而不是假设您可能很快就会需要它。正确的使用模式是一段时间后稳定在一个合理的数量,然后突然下降并重新建立起来。锯齿形图案。编写一个小的单元测试,反复调用创建和销毁您的表单对象,确保它执行截屏和访问数据库等重要工作。现在您可以确信自己没有失控泄漏问题。

关于c# - 内存是否在 Form.close() 上释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27874101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com