我有一个使用大量内存的应用程序,但是目前我无法更改此事实。我的问题是我有一个要执行的操作并提供一个进度对话框,但是显示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

最佳答案

还有一种解决方案将完全禁用与位图图像相关的内存压力以及后续的垃圾回收。它更像是一种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之类的某些控件将隐式添加与位图相关的内存压力,无论您如何初始化。

08-19 22:52