Benutzer mit den meisten Antworten
Async Problem mit GetFixedDocumentSequence

Frage
-
Hallo zusammen,
ich will eine kleine Klasse schreiben, die zu einem XPS-Dokument ein Array von Vorschaubildern (für jede Seite einzeln) generiert. Das hat auch super geklappt, solange ich es nicht asyncron gemacht habe. Meine Klasse sieht jetzt in etwa so aus:
class XpsDoc { private RenderTargetBitmap[] xpsThumbnails = null; private path = ""; public XpsDoc(string Path) { path = Path; } public RenderTargetBitmap[] XpsThumbnails { get{ return xpsThumbnails; } } public async Task LoadThumbnailsAsync() { xpsThumbnails = await Task<RenderTargetBitmap[]>.Run(() => { XpsDocument xpd = new XpsDocument(path, FileAccess.Read, CompressionOption.Normal); FixedDocumentSequence document = xpd.GetFixedDocumentSequence(); RenderTargetBitmap[] thmbArray = new RenderTargetBitmap[document.DocumentPaginator.PageCount]; //Pages rendern xpd.Close(); return thmbArray; }); } }
Der Aufruf im Hauptprogramm erfolgt dann so:
XpsDoc xdoc = new XpsDoc("C:\\test.xps"); await xdoc.LoadThumbnailsAsync();
Leider kriege ich eine XamlParseException bei dem Methodenaufruf "xpd.GetFixedDocumentSequence()":
Zusätzliche Informationen: Zeilennummer "2" und Zeilenposition "21" von "Durch den Aufruf des Konstruktors für Typ "System.Windows.Documents.DocumentReference", der den angegebenen Bindungseinschränkungen entspricht, wurde eine Ausnahme ausgelöst."
Weiß jemand, wo der Fehler liegen könnte? Es handelt sich offenbar um ein Multithreading Problem, da der Code ohne async gut funktioniert. Allerdings weiß ich nicht, was an dem Code problematisch ist. Die XPS-Datei ist im Hauptprogramm nicht geöffnet.
Antworten
-
Hallo,
erhältst du denn noch eine InnerException? Da stehen oftmals hilfreichere Informationen drin, wenn man eine XamlParseException bekommt.
Momentan vermute ich, dass verlangt wird die Methode im UI-Thread auszuführen. Das könnte mit der internen Funktionsweise zusammen hängen, aber genaueres weiß ich auch nicht.
Das hat auch ein kleiner Test mit deinem Code ergeben. Sollte es bei dir auch so sein, solltest du versuchen einen eigenen Task Scheduler einzusetzen, der den Code dann in einem STA-Thread ausführt. Ein Beispiel findest du unter ParallelExtensionsExtras Tour - #5 - StaTaskScheduler.Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert User95 Mittwoch, 6. April 2016 17:39
Alle Antworten
-
Hallo,
erhältst du denn noch eine InnerException? Da stehen oftmals hilfreichere Informationen drin, wenn man eine XamlParseException bekommt.
Momentan vermute ich, dass verlangt wird die Methode im UI-Thread auszuführen. Das könnte mit der internen Funktionsweise zusammen hängen, aber genaueres weiß ich auch nicht.
Das hat auch ein kleiner Test mit deinem Code ergeben. Sollte es bei dir auch so sein, solltest du versuchen einen eigenen Task Scheduler einzusetzen, der den Code dann in einem STA-Thread ausführt. Ein Beispiel findest du unter ParallelExtensionsExtras Tour - #5 - StaTaskScheduler.Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert User95 Mittwoch, 6. April 2016 17:39
-
Hallo,
erhältst du denn noch eine InnerException? Da stehen oftmals hilfreichere Informationen drin, wenn man eine XamlParseException bekommt.
Ja, hab nicht daran gedacht, da nachzuschauen. Die InnerException lautet: "Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies für viele Komponenten der Benutzeroberfläche erforderlich ist."
Vielen Dank für die Tutorialempfehlung! Ich glaube, das wird mein Problem lösen.