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

标签 c# .net winforms garbage-collection

我正在开发具有大量表单打开和关闭操作的反馈应用程序。当我启动我的应用程序需要 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/

相关文章:

c# - 需要数学库来操作序列/范围

c# - 适用于 .NET/Winforms 的完全托管文本编辑器组件

c# - 如何序列化List<IFilter>(诺基亚成像SDK)?

c# - 为什么我的 SqlConnection 在关闭后仍保留在 SSMS 进程列表中?

c# - 数组和线程安全访问

c# - 如何在 VS 2012 中获取 Crystal Reports?

c# - 子对象的向上转换和实例化之间的区别

c# - serverless.template 中的 aws VS2017 无服务器应用程序语法用于将过滤器添加到 s3 通知

c# - 如何为进行异步 WebClient 调用的 winforms 应用程序创建全局异常处理程序

winforms - 线程列表框C#SharpDevelop