var xpSfile = string.Format("{0}.xps",Guid.NewGuid().ToString());
var paginator = ((IDocumentPaginatorSource)preview.Document).DocumentPaginator;
using (var xpsDoc = new XpsDocument(xpSfile, FileAccess.ReadWrite, CompressionOption.Maximum))
{
using (var xpp = new XpsPackagingPolicy(xpsDoc))
{
using (var rsm = new XpsSerializationManager(xpp, false))
{
rsm.SaveAsXaml(paginator);
rsm.Commit();
xpsDoc.Close();
}
}
}
1、生成一份xps文档增加2M内存,循环生成1000份,内存只增不减,无法释放
2、等到内存涨到1G左右,就会报错“打开文件“C:\WINDOWS\FONTS\SIMSUN.TTC”时 I/O 错误。”
3、网上说的 GC.Collect();SetProcessWorkingSetSize、EmptyWorkingSet都不好使
找到原因是WPF实例化后不会释放内存,不知道为什么,尽量少实例化WPF对象,
又发现新问题 PdfSharp.Xps.XpsConverter.Convert(pdfXpsDoc, fileName, 0);占用内存极高,也是无法释放,还没解决
using了的话问题应该不是出在这几个对象身上吧,确定是这一段代码的问题吗?
///<Summary>
/// Handles releasing XpsDocuments resources
///</Summary>
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
_thumbnail = null;
_reachSignatures = null;
_reachSignatureList = null;
_opcPackage = null;
CurrentXpsManager.Close();
CommitInternal();
}
GC.SuppressFinalize(this);
_disposed = true;
}
这是Dispose的实现,你调用Close的时候他自己调用了Dispose(true)
请问如何解决?
少实例化WPF对象?
是指那些内容?XpsPackagingPolicy?