【问题标题】:How can I prevent garbage collection from being called when calling ShowDialog on a xaml window?在 xaml 窗口上调用 ShowDialog 时,如何防止调用垃圾收集?
【发布时间】:2013-01-13 06:19:40
【问题描述】:

我有一个使用大量内存的应用程序,但现在我无法改变这个事实。我的问题是我有一个我想执行的操作并提供一个进度对话框,但似乎显示 xaml 进度窗口导致 GC.Collect 被调用 10 次!有什么想法可以优化打开进度窗口吗?

根据我的 Ants Profiler,导致 GC.Collect 的调用是

System.Window.ShowDialog() ->
..
..
System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap ->
SafeMILHandle.UpdateEstimatedSize ->
SafeMILHandleMemoryPressure.ctor ->
MemoryPressure.Add ->
MemoryPressure.ProcessAdd ->
GC.Collect

【问题讨论】:

  • 你能告诉我如何超频我的 CPU 吗?可能不会,因为你甚至不知道我有什么样的硬件。同样,很难优化您看不到的代码。发布您的代码。
  • 导致垃圾回收的调用堆栈都是 .NET 程序集,所以我不知道我的代码的哪一部分值得发布。

标签: c# performance xaml memory


【解决方案1】:

还有一个解决方案可以完全禁用与位图图像相关的内存压力和后续垃圾收集。这更像是一个 hack,但你可以阅读类似的问题 here

typeof(BitmapImage).Assembly.GetType("MS.Internal.MemoryPressure").GetField("_totalMemory", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, Int64.MinValue / 2); 

这样可以避免搜索整个代码来查找和修改 WPF 图标初始化。除此之外,像System.Windows.Forms.Integration.ElementHost 这样的一些控件会隐式添加与位图相关的内存压力,无论您如何初始化。

【讨论】:

  • 警告!这不适用于最新的 .Net 4.6.2(版本 394802 / 394806)。 MemoryPressure 类不再存在,AddPressure 和 RemovePressure 已移至 GC。
  • 我也面临同样的问题。请告知如何在 .Net 4.6.2 中解决此问题
【解决方案2】:

您是否检查过与该主题相关的其他 stackoverflow 问题?您可能可以使用一些提示:

How to avoid garbage collection in real time .NET application?

【讨论】:

【解决方案3】:
【解决方案4】:

垃圾回收是由 WPF 图标的初始化引起的。当我从 xaml 中删除 icon 属性时:

<Window ... Icon="/CommonUI;component/Common/ProgressReporting/MyIcon.ico">

而是在构造函数中初始化它:

public ProgressWindow()
        {
            InitializeComponent();
            Icon = Properties.Resources.MyIcon.ToImageSource();
        }

问题消失了。

System.Window.UpdateIcon()ShowDialog() 期间不再调用的区别。 UpdateIcon() 调用正在为图标文件中的每个图像大小创建一个CachedBitmap,而该图标文件又调用MemoryPressure.Add,并且由于应用程序的高内存使用率,为每个创建的新位图调用GC.Collect

当在应用程序中加载大型项目时,这个小改动将我的进度对话框的加载时间减少了 15 秒!

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 2011-12-20
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多