【问题标题】:Memory is not released after dispose method is calling in wpf prism在 wpf prism 中调用 dispose 方法后内存未释放
【发布时间】:2019-09-14 10:54:51
【问题描述】:

我已经从一个窗口导航到另一个模态窗口。有 10 个可观察的集合。关闭窗口后,我将 null 设置为所有可观察的集合。但是在任务管理器中,内存并没有减少。当我打开模态窗口时,增加了 25 mb,但是当我关闭窗口时,只有 1mb 或 2mb 在处理所有可观察的集合后才减少。

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 诊断工具中的内存消耗。

【问题讨论】:

  • 当您将集合设置为 null(这是对它们的最后一次引用)时,垃圾收集器能够释放内存。就这样。但是垃圾收集器只会在内存压力很高或者你强制它收集时才会这样做(你应该只出于调试原因这样做)
  • 使用这个thread 有很多与此相关的解释清楚的例子

标签: c# wpf memory-leaks prism idisposable


【解决方案1】:

不确定消极的一面,但肯定会工作

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);
    }

在 Dispose 中调用 MemoryManagement.FlushMemory()

【讨论】:

  • Cl,上面的代码是清除内存,但我已经在我的应用程序中对大量视图模型实现了 dispose 方法。但是我不知道什么类型的否定会导致上面的代码。请任何人建议我对上述代码的缺点。
猜你喜欢
  • 2018-04-08
  • 2011-01-27
  • 1970-01-01
  • 2011-07-18
  • 2014-03-19
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多