Любые предложения по устранению проблем с производительностью 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, которые открывает поток пользовательского интерфейса. Но это кажется ужасно сложным решением. Кто-нибудь знает, есть ли альтернативный способ получения страниц документов, который не зависит от FixedDocumentSequence?


person tacovan    schedule 25.06.2010    source источник


Ответы (1)


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

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

person Erti-Chris Eelmaa    schedule 23.04.2013