表单关闭时释放内存

本文关键字:释放 内存 表单 | 更新日期: 2023-09-27 18:01:13

我搜索了很多关于表单关闭时释放内存的信息,但我没有找到任何释放表单使用的内存的解决方案。stackoverflow或其他论坛中的大多数答案都是表单。Dispose((或GC.Collect((对释放内存没有帮助。

但我发现一篇文章使用C#在Windows窗体应用程序中释放内存(http://codesmithdotnet.blogspot.com/2008/02/release-memory-in-windows-form.html)

幸运的是,文章中的代码运行良好:(

public class MemoryManagement
{
    [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
    private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
    public static void FlushMemory()
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        if (Environment.OSVersion.Platform == PlatformID.Win32NT)
        {
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
        }
    }
}

我的问题是,有人熟悉"SetProcessWorkingSetSize"方法吗?/它是如何工作的?/这种方式有利于释放内存吗?这会导致任何问题还是会使应用程序速度变慢?

表单关闭时释放内存

您应该只释放外部非托管资源(关闭打开的连接、文件处理程序等(,并使用该资源实现的Dispose方法来执行此操作。

无需尝试强制GC释放与窗体相关的托管对象。在99%的情况下根本不调用GC。

无需使用外部Windows API方法,它不是.NET方式。阅读MSDN上的内存管理工作原理。

您应该找到为什么您的托管对象没有被释放。

至于WinForms:大多数问题可能是由左事件处理程序引起的。查看Winforms应用程序中已回答的"内存泄漏"问题的更多详细信息。使用任何内存档案器(例如ANTS(来查找阻止Forms对象释放的引用。

Hans Passant在另一个问题中已经指出

SetProcessWorkingSetSize()控制进程使用的RAM数量。CCD_ 3通常用于增加为进程分配的RAM的数量。

1:-它是如何工作的?

答:-假设我的应用程序中有许多表单或对话框,我要在我关闭每个表单后调用SetProcessWorkingSetSize(),或者对话框,以便操作系统释放资源。

2:-这种方式有利于释放内存吗?

答:-我认为没有。Windows已经非常擅长动态控制这一点,当另一个进程需要RAM。手动执行此操作会降低程序的速度很多,当Windows被迫交换内存页面返回。

3:-这会导致任何问题,还是会使应用程序速度变慢?

答:答案2中提到了"是"。