zhanglaoshen
zhanglaoshen
采纳率66.7%
2021-05-09 14:43 阅读 122

C#调用XpsDocument存储xps文档,内存如何释放?

50
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);占用内存极高,也是无法释放,还没解决

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • 已采纳
    qq_48520962 Don't move 2021-05-09 20:51

    using了的话问题应该不是出在这几个对象身上吧,确定是这一段代码的问题吗?

    点赞 评论 复制链接分享
  • qq_48520962 Don't move 2021-05-09 21:57
            ///<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)

    点赞 1 评论 复制链接分享
  • Dear200892 Dear200892 2021-05-11 16:50

    请问如何解决?

    点赞 1 评论 复制链接分享
  • youbl 水边2 2021-05-10 17:29

    用了using,确实不太可能出问题,

    可以用WinDBG打dump,看看增长的内存是啥,参考我的博客:

    https://blog.csdn.net/youbl/article/details/88893182

    如果你有DotMemory,也是可以用的。

    点赞 评论 复制链接分享
  • Dear200892 Dear200892 2021-05-14 16:39

    少实例化WPF对象?

    是指那些内容?XpsPackagingPolicy?

    点赞 评论 复制链接分享

相关推荐