wpf 在API中加载PDF后释放内存

pw136qt2  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(211)

我有一个ASP.NETCore3.0API应用程序,它返回一个WPF页面的PDF文件。它自己生成WPF页面,然后将其转换为XPS,这样我就可以将其转换为PDF,但当它完成加载时,API不会将其从内存中释放,因此它只是在崩溃之前不断累积。我已经实现了GC.collect,每次它生成PDF时都是如此,但没有真实的成功。

类i用于使用IDisposable从WPF应用程序生成PDF
第一个

0pizxfdo

0pizxfdo1#

您可能面临的问题是大型对象堆的碎片(洛)。文章The Dangers of the Large Object Heap很好地解释了这个问题。我们在一个生成PDF文件的REST-api中遇到了同样的问题。问题是,使用的byte[]很可能大于85 kb,这将导致它被置于洛。您对GC.Collect();的调用将在堆的第0代上启动垃圾收集。如果您希望防止这种碎片的发生,您应该在调用GC.Collect();之前设置GC选项,如How to (not) use the large object heap in .Net中的"消除大型对象堆碎片“中所述
因此,基本上用以下内容替换您的GC呼叫:

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(generation: 2, GCCollectionMode.Forced, blocking: true, compacting: true);
GC.WaitForPendingFinalizers();
GC.Collect(generation: 2, GCCollectionMode.Forced, blocking: true, compacting: true);

相关问题