2 Stimmen

Datagrid-Bindung (WPF) verursacht UI-Verzögerung

Ich möchte in der Lage sein, Elemente zu einer Datentabelle mit einer schnellen Rate hinzuzufügen, ohne UI Verzögerung zu verursachen.

Ich mache jetzt Folgendes: Ich verwende eine ObservableCollection, die an das Datengitter gebunden ist.

Ich verwende einen Hintergrund-Thread, der Schleifen und ruft Invoke auf den aktuellen Dispatcher nur beim Einfügen/Entfernen von der beobachtbaren Sammlung. Der Aufruf von BeginInvoke stattdessen hat unerwünschte Ergebnisse.

Ich weiß, dass das Aufrufen von so viel auf dem Dispatcher die Verzögerung verursacht, aber ich weiß nicht, was sonst zu tun ist. Ich habe Hintergrund Arbeiter vor verwendet, aber ich glaube nicht, dass gilt für mein Szenario.

Was kann ich tun, damit die Benutzeroberfläche reaktionsschnell bleibt?

8voto

cordialgerm Punkte 8203

Stapeln Sie die Aktualisierungen - der Hintergrund-Thread könnte Elemente zu einer Warteschlange hinzufügen und Sie können Ihre gebundene beobachtbare Sammlung regelmäßig durch einen Aufruf aktualisieren. Werfen Sie einen Blick auf den System.Collections.Concurrent-Namensraum, wenn Sie Multi-Thread-Erzeuger behandeln müssen

6voto

Greg Sansom Punkte 19667

Eine große Schwäche in Ihrem Design ist, dass durch die Bindung an eine ObservableCollection, Sie verursachen die UI, um jedes Element, das die Liste (möglicherweise Tausende) hinzugefügt wird - auch wenn am Ende der Verarbeitung gibt es nur 10 Elemente, die gerendert werden müssen.

Ich sah enorme Verbesserungen, indem ich die ObservableCollection in eine Liste änderte und das DataGrid am Ende der Verarbeitung manuell aktualisierte - auf diese Weise muss die Benutzeroberfläche immer nur 10 Elemente verarbeiten. Ich habe festgestellt, dass diese Änderung eine 50 %ige Leistungssteigerung bewirkt hat und dass die Benutzeroberfläche zu 100 % reaktionsfähig ist, während die Liste verarbeitet wird.

Wenn Sie die Liste über einen längeren Zeitraum bearbeiten und Änderungen live anzeigen müssen, können Sie das DataGrid alle 100 Elemente aktualisieren. Dies würde die Ergebnisse mit einer Genauigkeit von etwa 0,5 Sekunden anzeigen, was ausreichend sein sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X