我正在尝试提供XPS文档的实时预览,而不会挂起我的UI线程。打开文档的速度非常快,但是当我调用GetFixedDocumentSequence()时,我的UI会在文档突然消失的几秒钟内无响应。
// creating the doc is fine (0.005 seconds)
XpsDocument doc=new XpsDocument("BigFile.xps",FileAccess.Read);
// this hangs the UI for several seconds
FixedDocumentSequence seq=XpsDocument.GetFixedDocumentSequence();
// Once I have the sequence, GetPageAsync lets me pull out pages without breaking the UI
// ....
显而易见的解决方案是在工作线程上打开文档,但是FixedDocumentSequence与创建它的线程相关联,因此我无法从UI线程访问它,如果我尝试从工作者调用GetPageAsync线程我得到一个例外,因为DocumentPages包含视觉效果。
我唯一能想到的是在单独的UI线程上创建文档,将文档分解为页面,然后将这些页面保存为UI线程打开的XPS文件。但这似乎是一个非常复杂的解决方案。有没有人知道是否有另一种方法来获取不依赖于FixedDocumentSequence的DocumentPages?
答案 0 :(得分:1)
有一个简单的解决方案。它被称为多线程UI,它可以帮助您按照自己的方式执行所有操作,但有两个UI线程而不是一个。这意味着您的XPS可以在没有任何问题的情况下加载单独的UI线程。我过去自己实现了它,这很好。
http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx