Merging XPS documents causing memory leak<font face=Arial size=2> <p align=left><font face=Arial size=2>I am using the following code to merge xps documents.   I do this in a web app.  The code works fine without a problem, however I get a memory leak.  With every merge more handles are created and more Heap 2 memory is allocated and will not be taken back, even if I force a garbage collection. ie. GC.Collect( 2 ).</font></p> <p align=left> </p> <p align=left>This memory is never freed and eventually the web site runs into SystemOutOfMemory.</p> <p align=left> </p> <p align=left>Can anyone see something I am doing wrong?  Or if they have encountered this problem before, know of a work around?</p> <p><font size=1></font> </p><font size=1> <p align=left></font><font color="#2b91af" size=1> <div class=codeseg> <div class=codecontent> <div class=codesniptitle><span style="width:100%">Code Block</span></div> <p align=left><font color="#2b91af" size=1>Package</font><font size=1> oPackage = </font><font color="#0000ff" size=1>null</font><font size=1>;</p> <p align=left></font><font color="#2b91af" size=1>XpsDocument</font><font size=1> oXpsDocument = </font><font color="#0000ff" size=1>null</font><font size=1>;</p> <p align=left></font><font color="#0000ff" size=1>try</font><font size=1> {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#008000" size=1>// New XPS package</p></font><font size=1> <p align=left>oPackage = </font><font color="#2b91af" size=1>Package</font><font size=1>.Open( sTempFilename, </font><font color="#2b91af" size=1>FileMode</font><font size=1>.Create );</p> <p align=left>oXpsDocument = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>XpsDocument</font><font size=1>( oPackage, </font><font color="#2b91af" size=1>CompressionOption</font><font size=1>.SuperFast );</p> <p align=left></font><font color="#2b91af" size=1>FixedDocumentSequence</font><font size=1> oFixedDocumentSequence = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>FixedDocumentSequence</font><font size=1>();</p> <p align=left></font><font color="#008000" size=1>// Read in old </p></font><font size=1> <p align=left></font><font color="#0000ff" size=1>foreach</font><font size=1>( </font><font color="#0000ff" size=1>string</font><font size=1> sXpsDocument </font><font color="#0000ff" size=1>in</font><font size=1> sXPSFiles ) {</p></font><font size=1> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#2b91af" size=1>XpsDocument</font><font size=1> oSourceDocument = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>XpsDocument</font><font size=1>( sXpsDocument, </font><font color="#2b91af" size=1>FileAccess</font><font size=1>.Read );</p> <p align=left></font><font color="#2b91af" size=1>FixedDocumentSequence</font><font size=1> oOldFixedDocumentSequence = oSourceDocument.GetFixedDocumentSequence();</p> <p align=left></font><font color="#0000ff" size=1>foreach</font><font size=1>( </font><font color="#2b91af" size=1>DocumentReference</font><font size=1> oDocumentReference </font><font color="#0000ff" size=1>in</font><font size=1> oOldFixedDocumentSequence.References ) {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#2b91af" size=1>DocumentReference</font><font size=1> oNewDocReference = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>DocumentReference</font><font size=1>();</p> <p align=left>( oNewDocReference </font><font color="#0000ff" size=1>as</font><font size=1> </font><font color="#2b91af" size=1>IUriContext</font><font size=1> ).BaseUri = ( oDocumentReference </font><font color="#0000ff" size=1>as</font><font size=1> </font><font color="#2b91af" size=1>IUriContext</font><font size=1> ).BaseUri;</p> <p align=left>oNewDocReference.Source = oDocumentReference.Source;</p> <p align=left>oFixedDocumentSequence.References.Add( oNewDocReference );</p> <p align=left>oNewDocReference = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p> <p align=left>oSourceDocument.Close();</p> <p align=left>oSourceDocument = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p> <p align=left></font><font color="#2b91af" size=1>XpsDocumentWriter</font><font size=1> oXpsDocumentWriter = </font><font color="#2b91af" size=1>XpsDocument</font><font size=1>.CreateXpsDocumentWriter( oXpsDocument );</p> <p align=left></font><font color="#008000" size=1>//oXpsDocumentWriter.WriteAsync( oFixedDocumentSequence );</p></font><font size=1> <p align=left>oXpsDocumentWriter.Write( oFixedDocumentSequence );</p></blockquote> <p align=left></p> <blockquote dir=ltr style="margin-right:0px"> <p align=left> </p> <p align=left>oXpsDocument.Close();</p> <p align=left>oPackage.Close();</p> <p align=left> </p> <p align=left>oFixedDocumentSequence = </font><font color="#0000ff" size=1>null</font><font size=1>;</p> <p align=left>oXpsDocumentWriter = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote></font><font size=1> <p align=left>} </font><font color="#0000ff" size=1>catch</font><font size=1>( </font><font color="#2b91af" size=1>Exception</font><font size=1> ex ) {</font></p> <blockquote dir=ltr style="margin-right:0px"> <p align=left><font size=1>// Output exception</p></blockquote></font><font size=1> <p align=left>} </font><font color="#0000ff" size=1>finally</font><font size=1> {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#0000ff" size=1>if</font><font size=1>( oXpsDocument != </font><font color="#0000ff" size=1>null</font><font size=1> ) {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>oXpsDocument.Close();</p> <p align=left>oXpsDocument = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p> <p align=left></font><font color="#0000ff" size=1>if</font><font size=1>( oPackage != </font><font color="#0000ff" size=1>null</font><font size=1> ) {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>oPackage.Close();</p> <p align=left>oPackage = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p></blockquote> <p align=left>}</p></font> <p align=left> </p></div></div> <p align=left> </p></font> <p></p><font size=1> <p align=left></p></font></font>© 2009 Microsoft Corporation. All rights reserved.Thu, 07 May 2009 09:37:36 Z34db5209-1276-4b3a-a3b1-e257e38fb062http://social.msdn.microsoft.com/Forums/en-US/windowsxps/thread/34db5209-1276-4b3a-a3b1-e257e38fb062#34db5209-1276-4b3a-a3b1-e257e38fb062http://social.msdn.microsoft.com/Forums/en-US/windowsxps/thread/34db5209-1276-4b3a-a3b1-e257e38fb062#34db5209-1276-4b3a-a3b1-e257e38fb062Keith Ballhttp://social.msdn.microsoft.com/Profile/en-US/?user=Keith%20BallMerging XPS documents causing memory leak<font face=Arial size=2> <p align=left><font face=Arial size=2>I am using the following code to merge xps documents.   I do this in a web app.  The code works fine without a problem, however I get a memory leak.  With every merge more handles are created and more Heap 2 memory is allocated and will not be taken back, even if I force a garbage collection. ie. GC.Collect( 2 ).</font></p> <p align=left> </p> <p align=left>This memory is never freed and eventually the web site runs into SystemOutOfMemory.</p> <p align=left> </p> <p align=left>Can anyone see something I am doing wrong?  Or if they have encountered this problem before, know of a work around?</p> <p><font size=1></font> </p><font size=1> <p align=left></font><font color="#2b91af" size=1> <div class=codeseg> <div class=codecontent> <div class=codesniptitle><span style="width:100%">Code Block</span></div> <p align=left><font color="#2b91af" size=1>Package</font><font size=1> oPackage = </font><font color="#0000ff" size=1>null</font><font size=1>;</p> <p align=left></font><font color="#2b91af" size=1>XpsDocument</font><font size=1> oXpsDocument = </font><font color="#0000ff" size=1>null</font><font size=1>;</p> <p align=left></font><font color="#0000ff" size=1>try</font><font size=1> {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#008000" size=1>// New XPS package</p></font><font size=1> <p align=left>oPackage = </font><font color="#2b91af" size=1>Package</font><font size=1>.Open( sTempFilename, </font><font color="#2b91af" size=1>FileMode</font><font size=1>.Create );</p> <p align=left>oXpsDocument = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>XpsDocument</font><font size=1>( oPackage, </font><font color="#2b91af" size=1>CompressionOption</font><font size=1>.SuperFast );</p> <p align=left></font><font color="#2b91af" size=1>FixedDocumentSequence</font><font size=1> oFixedDocumentSequence = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>FixedDocumentSequence</font><font size=1>();</p> <p align=left></font><font color="#008000" size=1>// Read in old </p></font><font size=1> <p align=left></font><font color="#0000ff" size=1>foreach</font><font size=1>( </font><font color="#0000ff" size=1>string</font><font size=1> sXpsDocument </font><font color="#0000ff" size=1>in</font><font size=1> sXPSFiles ) {</p></font><font size=1> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#2b91af" size=1>XpsDocument</font><font size=1> oSourceDocument = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>XpsDocument</font><font size=1>( sXpsDocument, </font><font color="#2b91af" size=1>FileAccess</font><font size=1>.Read );</p> <p align=left></font><font color="#2b91af" size=1>FixedDocumentSequence</font><font size=1> oOldFixedDocumentSequence = oSourceDocument.GetFixedDocumentSequence();</p> <p align=left></font><font color="#0000ff" size=1>foreach</font><font size=1>( </font><font color="#2b91af" size=1>DocumentReference</font><font size=1> oDocumentReference </font><font color="#0000ff" size=1>in</font><font size=1> oOldFixedDocumentSequence.References ) {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#2b91af" size=1>DocumentReference</font><font size=1> oNewDocReference = </font><font color="#0000ff" size=1>new</font><font size=1> </font><font color="#2b91af" size=1>DocumentReference</font><font size=1>();</p> <p align=left>( oNewDocReference </font><font color="#0000ff" size=1>as</font><font size=1> </font><font color="#2b91af" size=1>IUriContext</font><font size=1> ).BaseUri = ( oDocumentReference </font><font color="#0000ff" size=1>as</font><font size=1> </font><font color="#2b91af" size=1>IUriContext</font><font size=1> ).BaseUri;</p> <p align=left>oNewDocReference.Source = oDocumentReference.Source;</p> <p align=left>oFixedDocumentSequence.References.Add( oNewDocReference );</p> <p align=left>oNewDocReference = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p> <p align=left>oSourceDocument.Close();</p> <p align=left>oSourceDocument = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p> <p align=left></font><font color="#2b91af" size=1>XpsDocumentWriter</font><font size=1> oXpsDocumentWriter = </font><font color="#2b91af" size=1>XpsDocument</font><font size=1>.CreateXpsDocumentWriter( oXpsDocument );</p> <p align=left></font><font color="#008000" size=1>//oXpsDocumentWriter.WriteAsync( oFixedDocumentSequence );</p></font><font size=1> <p align=left>oXpsDocumentWriter.Write( oFixedDocumentSequence );</p></blockquote> <p align=left></p> <blockquote dir=ltr style="margin-right:0px"> <p align=left> </p> <p align=left>oXpsDocument.Close();</p> <p align=left>oPackage.Close();</p> <p align=left> </p> <p align=left>oFixedDocumentSequence = </font><font color="#0000ff" size=1>null</font><font size=1>;</p> <p align=left>oXpsDocumentWriter = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote></font><font size=1> <p align=left>} </font><font color="#0000ff" size=1>catch</font><font size=1>( </font><font color="#2b91af" size=1>Exception</font><font size=1> ex ) {</font></p> <blockquote dir=ltr style="margin-right:0px"> <p align=left><font size=1>// Output exception</p></blockquote></font><font size=1> <p align=left>} </font><font color="#0000ff" size=1>finally</font><font size=1> {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left></font><font color="#0000ff" size=1>if</font><font size=1>( oXpsDocument != </font><font color="#0000ff" size=1>null</font><font size=1> ) {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>oXpsDocument.Close();</p> <p align=left>oXpsDocument = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p> <p align=left></font><font color="#0000ff" size=1>if</font><font size=1>( oPackage != </font><font color="#0000ff" size=1>null</font><font size=1> ) {</p> <blockquote dir=ltr style="margin-right:0px"> <p align=left>oPackage.Close();</p> <p align=left>oPackage = </font><font color="#0000ff" size=1>null</font><font size=1>;</p></blockquote> <p align=left>}</p></blockquote> <p align=left>}</p></font> <p align=left> </p></div></div> <p align=left> </p></font> <p></p><font size=1> <p align=left></p></font></font>Thu, 18 Oct 2007 13:59:35 Z2007-10-18T13:59:35Zhttp://social.msdn.microsoft.com/Forums/en-US/windowsxps/thread/34db5209-1276-4b3a-a3b1-e257e38fb062#439dccef-b10f-42e3-a795-d69ef71158fahttp://social.msdn.microsoft.com/Forums/en-US/windowsxps/thread/34db5209-1276-4b3a-a3b1-e257e38fb062#439dccef-b10f-42e3-a795-d69ef71158faJo0815http://social.msdn.microsoft.com/Profile/en-US/?user=Jo0815Merging XPS documents causing memory leakThis is a bug in the FixedDocumentSequence. The only *work-around* currently exists is to call UpdateLayout() to at least *one* fixed page...<br/> <br/> in your case:<br/> <br/> ...<br/> <span style="font-family:Arial;font-size:x-small"><span style="color:#2b91af;font-size:xx-small"><span style="font-size:xx-small">FixedPage page = oOldFixedDocumentSequence.DocumentPaginator.GetPage(0).Visual as FixedPage;<br/> page.UpdateLayout();</span> </span> </span> <span style="font-family:Arial;font-size:x-small"><span style="color:#2b91af;font-size:xx-small"><span style="font-size:xx-small"><br/> </span> </span> </span> ...<br/> <span style="font-family:Arial;font-size:x-small"><span style="color:#2b91af;font-size:xx-small"><span style="font-size:xx-small"><br/> </span> </span> </span> and it should work... old question, but in case someone is running into the same problem... (c;<br/> <br/> -Jo<br/>Thu, 07 May 2009 09:37:36 Z2009-05-07T09:38:27Z