Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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
C# 窗体关闭时释放内存_C#_.net_Winforms_Memory Management_Windows Applications - Fatal编程技术网

C# 窗体关闭时释放内存

C# 窗体关闭时释放内存,c#,.net,winforms,memory-management,windows-applications,C#,.net,Winforms,Memory Management,Windows Applications,我搜索了很多关于表单关闭时释放内存的信息, 但我没有找到任何释放表单使用的内存的解决方案。 stackoverflow或其他论坛中的大多数答案是form.Dispose()或GC.Collect()无助于释放内存 但是我发现了一篇文章() 幸运的是,文章中的代码运行良好:) 我的问题是,是否有人熟悉“SetProcessWorkingSetSize”方法它是如何工作的?/这种方式有利于释放内存吗?这会导致任何问题还是会使应用程序运行缓慢?如中所述 SetProcessWorkingSetSize

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

但是我发现了一篇文章()

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

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

如中所述

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

1:-它是如何工作的

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

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

答:我想没有。Windows已经非常擅长动态操作了 控制这一点,当另一个需要时,根据需要交换内存页 进程需要RAM。通过手动执行此操作,可以降低程序的速度 很多,当Windows被迫交换页面时,会导致很多页面错误 内存页返回

3:-这是否会导致任何问题,或者这会使应用程序变慢

答:回答2中提到的是


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

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

不需要使用外部Windows API方法,这不是.NET方式。阅读内存管理是如何工作的

您应该找到未处置托管对象的原因


至于WinForms:大多数问题可能是由左事件处理程序引起的。检查已回答问题的更多详细信息。使用任何内存探查器(例如ANTS)来查找阻止窗体对象释放的引用。

为什么要这样做?建议不要这样做,垃圾收集器会帮你这样做。这是.NET-将内存管理留给垃圾收集器。有一些最佳实践,比如在IDisposable上调用Dispose(),但不确定您在这里想要实现什么?@poke,您的问题的答案是我的问题。表单关闭后,分配给该表单的内存不会释放。所以我试着用那个代码释放内存,但这并不能回答为什么你想手动释放内存。你为什么一开始就关心它?
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);
        }
    }
}