Любые предложения по решению проблем производительности XpsDocument GetFixedDocumentSequence?

Я пытаюсь предоставить предварительный просмотр документов XPS без зависания потока пользовательского интерфейса. Открытие документа достаточно быстрое, но когда я вызываю GetFixedDocumentSequence(), мой пользовательский интерфейс перестает отвечать на запросы в течение нескольких секунд, пока документ выпадает.

// 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 привязан к потоку, который его создал, поэтому я не могу получить к нему доступ из потока пользовательского интерфейса, и если я пытаюсь вызвать GetPageAsync из рабочего потока, я получаю исключение, потому что DocumentPages содержат визуальные эффекты.

Единственное, о чем я могу думать, - это создать документ в отдельном потоке пользовательского интерфейса, разбить документ на страницы, а затем сохранить эти страницы в виде файлов XPS, которые открывается потоком пользовательского интерфейса. Но это кажется ужасно сложным решением. Кто-нибудь знает, есть ли альтернативный способ получения DocumentPages, который не зависит от FixedDocumentSequence?

1 ответ

Есть простое решение. Он называется многопоточным пользовательским интерфейсом и помогает вам делать все так, как вы делаете, но иметь два потока пользовательского интерфейса вместо одного. Это означает, что ваш XPS может загружаться в отдельном потоке пользовательского интерфейса без каких-либо проблем. Я реализовал это сам в прошлом, и это хорошо.

http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx

Другие вопросы по тегам