Память не освобождается после вызова метода dispose в призме wpf - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть переход от одного окна к другому модальному окну.Есть 10 наблюдаемых коллекций.После закрытия окна я установил значение null для всей наблюдаемой коллекции.Но в диспетчере задач память не уменьшается.Когда я открываю модальное окно, увеличивается 25 МБ, но когда я закрываю окно, только 1 МБ или 2 МБ уменьшаются только после удаления всей наблюдаемой коллекции.

private bool disposedValue = false;
protected virtual void Dispose(bool disposing)
{
   if (!disposedValue)
   {
       if (disposing)
       {
           Collection1 = null;
           Collection2 = null;
           Collection3 = null;
           Collection4 = null;
           Collection5 = null;
       }
       disposedValue = true;
   }
}

Пожалуйста, скажите мне, что я сделал что-то не так.Пожалуйста, поделитесь своим ценным предложением.Я также проверил потребление памяти в Visual Studio Diagnostic Tools.

1 Ответ

0 голосов
/ 25 апреля 2019

Не уверен насчет отрицательной стороны, но работаю наверняка

public class MemoryManagement
    {
        /// <summary>
        /// Clear un wanted memory
        /// </summary>
        public static void FlushMemory()
        {
            try
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                {
                    SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                }
            }
            catch (Exception e)
            {
            }
        }

        /// <summary>
        /// set process working size
        /// </summary>
        /// <param name="process">Gets process</param>
        /// <param name="minimumWorkingSetSize">Gets minimum working size</param>
        /// <param name="maximumWorkingSetSize">Gets maximum working size</param>
        /// <returns>Returns value</returns>
        [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet =
          CharSet.Ansi, SetLastError = true)]
        private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
    }

Вызовите MemoryManagement.FlushMemory () в Dispose

...