首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DocumentPaginator是否将所有DocumentPages保留在内存中,直到它完成打印作业?

WPF DocumentPaginator是否将所有DocumentPages保留在内存中,直到它完成打印作业?
EN

Stack Overflow用户
提问于 2011-03-22 06:47:29
回答 2查看 2.9K关注 0票数 3

关于WPF的DocumentPaginator的严格理论问题:

当使用WPF DocumentPaginator类打印多页文档时,分页程序是否在文档完成打印之前将它在打印作业历史记录上请求的所有DocumentPages保留在内存中?或者,在打印作业完成之前(即释放内存),它会处理掉任何不再需要的DocumentPages吗?有没有一种方法可以手动告诉分页器在打印过程中释放旧的/不需要的DocumentPages而不会遇到异常?

非常感谢您对此的帮助!

EN

回答 2

Stack Overflow用户

发布于 2011-03-22 16:49:56

我和你有完全一样的问题。

它不会处理之前加载的页面。为了解决这个问题,我所做的就是在GetPage()方法的末尾保留对加载页面的引用,并在GetPage方法的开头处理最后加载的页面。

下面是你额外问题的答案:

我的印象是,System.Windows.Controls.PrintDialog.Print(DocumentPaginator,title的实现是这样的:

代码语言:javascript
复制
Public void PrintDocument(DocumentPaginator paginator, string title)
{
   Dictionary<int, DocumentPage> pages = new Dictionary<int DocumentPage>();
   for(int i=0; i<paginator.PageCount(); i++)
   {
      pages.Add(i, paginator.GetPage(i));
      UnknownPrinterEngine.SendPageToPrinter(pages(i)); //this is just imagination
   }
}

如果实现确实是这样,则对每个已处理页面的本地引用将保持活动状态(在字典中),直到方法执行完成。-->不会释放内存。

我做了什么来避免这种情况(在扩展DocumentPaginator的类中实现GetPage):

代码语言:javascript
复制
DocumentPage lastLoadedPage = null;
public DocumentPage GetPage(int pageNumber)
{
   if(lastLoadedPage != null)
   {
      lastLoadedPage.Dispose()
   }
   //MyPrintControl should be your custom UserControl which represents the page to print
   myPrintControl pageContent = new MyPrintControl();
   pageContent.Width = PageSize.Width;
   pageContent.Height = PageSize.Height;

   pageContent.Measure(PageSize);
   pageContent.Arrange(new Rect(new Point(0,0), PageSize));

   DocumentPage actualPage = New DocumentPage(pageContent);
   lastLoadedPage = actualPage;
   return actualPage;
}

最后,您应该实现IDisposable接口,并在Dispose方法中清除lastLoadedPage字段,以释放最后一页的内存。

票数 2
EN

Stack Overflow用户

发布于 2015-04-14 03:03:55

这解决了我在创建大型System.Windows.Xps.VisualsToXpsDocument文档时内存不足的问题。还可以研究一下PrintQueue.CreateXpsDocumentWriter(somePrintQueue)。很抱歉,我没有足够的代表来发表评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5384653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档