2015-07-06 2 views
0

Я много искал о выпуске памяти при закрытии формы, , но я не нашел решения для выпуска памяти, используемой формой. Большая часть ответа в stackoverflow или других форумах - форма.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

Почему вы хотите это сделать? – poke

+1

Рекомендация не делает этого, сборщик мусора сделает это за вас. –

+0

Это .NET - оставить управление памятью сборщиком мусора. Есть лучшие методы, такие как вызов Dispose() на IDisposable, но не уверен, чего вы пытаетесь достичь здесь? – Kevin

ответ

1

Как уже отмечалось на Hans Passantanother question в

SetProcessWorkingSetSize() управляет количеством оперативной памяти, который использует ваш процесс. SetProcessWorkingSetSize обычно используется для увеличения объема ОЗУ, выделенного для процесса.

1: - Как это работает?

Ans: - Предположим, у меня есть много форм и диалоговые окна в моем приложении, я хочу называть SetProcessWorkingSetSize() после того как я закрыть каждую форму или диалоговое окно, так что ОС освобождает ресурсы.

2: - Этот способ хорош для освобождения памяти?

Ans: Я думаю номер для Windows уже достаточно хорошо динамически управления этим, замена страниц памяти на спрос, когда другой процесс нуждается в оперативной памяти. Делая это вручную, вы замедлить вашу программу много, вызывают много ошибок страниц, когда Windows, вынужден поменять страниц памяти обратно в

3:. -Это приведет к какому-либо вопросу или это сделает приложение медленным?

Ans: Да, упомянутые в ответ 2.

1

Вы должны освободить только внешние неуправляемые ресурсы (закрыть открытые соединения, обработчики файлов и т.д.) и сделать это с помощью метода Dispose реализован, что Ресурсы.

Не нужно пытаться заставить GC выпустить управляемые объекты, связанные с Формами. В 99% случаев вообще не называются GC.

Не нужно использовать внешние методы API Windows, это не .NET способ. Прочтите, как работает управление памятью на MSDN.

Вы должны найти , почему ваши управляемые объекты не расположены.

Что касается WinForms: большинство проблем могут быть вызваны обработчиками левых событий.Проверьте более подробную информацию об уже ответом на вопрос Memory Leaks in Winforms application. Используйте любой Profiler Profiler (например, ANTS), чтобы найти ссылки, которые не позволяют освобождать объекты Forms.

Смежные вопросы