Ich benutze ein Canvas als Host für Tausende von DrawingVisuals. Das Laden ist sehr langsam. Ich habe nur versucht, die bei sichtbaren DrawingVisuals beginnen zu laden und mit async und wartet auf die anderen DrawingVisuals:Wie wird DrawingVisuals asynchron mit Async und Await geladen?
Async Sub AddVisuals()
Dim visuals = Await Task.Run(AddressOf CreateVisuals)
For Each vis In visuals
AddVisualChild(vis)
AddLogicalChild(vis)
Next
End Sub
Function CreateVisuals() As DrawingVisual()
....
End Function
Aber Task.Run ruft einen anderen Thread. So bekomme ich eine InvalidOperation-Ausnahme, die besagt, dass das Objekt einem anderen Thread gehört. Aber here Ich finde:
Die async und warten Schlüsselwörter zusätzliche Threads verursachen keine geschaffen werden. Async-Methoden erfordern kein Multithreading, da eine asynchrone Methode nicht in einem eigenen Thread ausgeführt wird. Die Methode wird im aktuellen Synchronisationskontext ausgeführt und verwendet die Zeit im Thread nur dann, wenn die Methode aktiv ist. Sie können Task.Run verwenden, um CPU-gebundene Arbeit in einen Hintergrundthread zu verschieben, aber ein Hintergrundthread hilft nicht bei einem Prozess, der nur darauf wartet, dass Ergebnisse verfügbar werden.
Also gibt es eine Möglichkeit, ein DispatcherObject (hier: DrawingVisual) mit async hinzuzufügen und zu erwarten?
Da ich Visual Studio 2010 benutze, habe ich nicht mit async/await gearbeitet, aber würde 'Dim visuals = CreateVisuals()' nicht den Trick machen? Oder einfach 'Dim visicals = CreateVisuals()', da CreateVisuals() den aktuellen Thread blockieren sollte, bis er zurückkehrt. –
Aber ich möchte den aktuellen Thread nicht blockieren. Das Zeichnen aller Visuals dauert zu lange und blockiert die Benutzeroberfläche. – ubsch
Warum verwenden Sie dann 'Await'? –