gpt4 book ai didi

.net - 在.Net中打开XPS文档会导致内存泄漏

转载 作者:行者123 更新时间:2023-12-02 07:41:11 24 4
gpt4 key购买 nike

以下代码片段说明了打开 XPS 文件时的内存泄漏。如果您运行它并观察任务管理器,它会增长并且不会释放内存,直到应用程序退出。

'***** 控制台应用程序开始。

Module Main

Const DefaultTestFilePath As String = "D:\Test.xps"
Const DefaultLoopRuns As Integer = 1000

Public Sub Main(ByVal Args As String())
Dim PathToTestXps As String = DefaultTestFilePath
Dim NumberOfLoops As Integer = DefaultLoopRuns

If (Args.Count >= 1) Then PathToTestXps = Args(0)
If (Args.Count >= 2) Then NumberOfLoops = CInt(Args(1))

Console.Clear()
Console.WriteLine("Start - {0}", GC.GetTotalMemory(True))
For LoopCount As Integer = 1 To NumberOfLoops

Console.CursorLeft = 0
Console.Write("Loop {0:d5}", LoopCount)

' The more complex the XPS document and the more loops, the more memory is lost.
Using XPSItem As New Windows.Xps.Packaging.XpsDocument(PathToTestXps, System.IO.FileAccess.Read)
Dim FixedDocSequence As Windows.Documents.FixedDocumentSequence

' This line leaks a chunk of memory each time, when commented out it does not.
FixedDocSequence = XPSItem.GetFixedDocumentSequence
End Using
Next
Console.WriteLine()
GC.Collect() ' This line has no effect, I think the memory that has leaked is unmanaged (C++ XPS internals).
Console.WriteLine("Complete - {0}", GC.GetTotalMemory(True))

Console.WriteLine("Loop complete but memory not released, will release when app exits (press a key to exit).")
Console.ReadKey()

End Sub

End Module

'***** 控制台应用程序结束。

它循环一千次的原因是因为我的代码处理大量文件并快速泄漏内存,从而导致 OutOfMemoryException。强制垃圾收集不起作用(我怀疑它是 XPS 内部的非托管内存块)。

代码最初位于另一个线程和类中,但已简化为这样。

非常感谢任何帮助。

瑞恩

最佳答案

嗯,我找到了。这是框架中的一个错误,要解决它,您需要添加对 UpdateLayout 的调用。 using 语句可以更改为以下内容以提供修复;

        Using XPSItem As New Windows.Xps.Packaging.XpsDocument(PathToTestXps, System.IO.FileAccess.Read)
Dim FixedDocSequence As Windows.Documents.FixedDocumentSequence
Dim DocPager As Windows.Documents.DocumentPaginator

FixedDocSequence = XPSItem.GetFixedDocumentSequence
DocPager = FixedDocSequence.DocumentPaginator
DocPager.ComputePageCount()

' This is the fix, each page must be laid out otherwise resources are never released.'
For PageIndex As Integer = 0 To DocPager.PageCount - 1
DirectCast(DocPager.GetPage(PageIndex).Visual, Windows.Documents.FixedPage).UpdateLayout()
Next
FixedDocSequence = Nothing
End Using

关于.net - 在.Net中打开XPS文档会导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/218681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com