表单关闭时释放内存

时间:2015-07-06 07:07:34

标签: c# .net winforms memory-management windows-applications

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

但我找到了一篇文章Release memory in Windows Form application using C#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”? / 这个怎么运作? /这种方式对释放记忆有好处吗?这会导致任何问题,否则会导致应用程序变慢?

2 个答案:

答案 0 :(得分:1)

正如Hans Passant

中的another question所指出的那样

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

1: - 它如何运作?

  

Ans: - 假设我的应用程序中有很多表单或对话框,我   我想在关闭每张表格后致电SetProcessWorkingSetSize()   对话框,以便操作系统释放资源。

2: - 这种方式有利于释放记忆吗?

  答:我认为,Windows已经非常擅长动态   控制它,在另一个时按需交换内存页   进程需要RAM。通过手动执行此操作,可以减慢程序速度   很多,当Windows被迫交换时导致很多页面错误   记忆页面重新进入。

3: - 这会导致任何问题,否则会导致应用程序变慢?

  

答案: - 答案2中提到了。

答案 1 :(得分:1)

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

无需尝试强制GC释放与Forms相关的托管对象。在99%的情况下,根本不打电话给GC。

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

您应该找到为什么您的托管对象未被处置。

对于WinForms:大多数问题可能是由左侧事件处理程序引起的。查看已回答问题Memory Leaks in Winforms application的更多详细信息。使用任何Memory Profiler(例如ANTS)以查找阻止Forms对象释放的引用。