2010-08-04 5 views
5

Ich versuche, einen Hintergrund-Worker zu verwenden, um eine große Menge an Daten aus der Datenbank abzurufen, ohne den Haupt-Thread zu blockieren. Dies scheint gut zu funktionieren, außer dass das Update beim Aktualisieren der Benutzeroberfläche den Bildschirm einfriert. Relevanter Code wie folgt:C# Hintergrund-UI-Update

Das Update dauert ca. 2 - 3 Sekunden, für die der Bildschirm gesperrt ist. Ich weiß, dass nur der Haupt-Thread den Bildschirm aktualisieren kann, aber ist es möglich, diese Daten in irgendeiner Weise in den Speicher zu laden (in einem Hintergrund-Thread oder einer anderen Instanz einer Listenansicht oder etwas) und sie dann einfach anzuzeigen? Ich will nur, dass das Programm die Daten einfach aktualisiert, ohne Zeit im Hauptthread zu verbrauchen.

Antwort

1

Ich empfehle, die Daten in den Speicher zu laden und einen virtuellen ModusListView zu verwenden. Auf diese Weise erstellen Sie nur die Objekte ListViewItem, wie sie benötigt werden.

1

Wenn Sie sehr große Datenmengen in die Benutzeroberfläche laden müssen, wird es Zeit benötigen und unsere App blockieren. Die Option ist intelligentes Scrollen oder Seitenumbruch. Sie laden alle Daten, aber Sie legen es Stück für Stück auf Benutzerwunsch.

0

Zusätzlich zur Virtualisierung würde ich empfehlen, die Artikel in Chargen von z. B. 100 zu zerlegen und jede Charge in ihrer eigenen Nachricht hinzuzufügen. Auf diese Weise kann die Benutzeroberfläche andere Nachrichten verarbeiten, während die Stapel zu ListView hinzugefügt werden.

Mit anderen Worten, alle RunWorkerCompleted Handler ist Warteschlange der erste Stapel für das Hinzufügen in einer separaten Nachricht. Die Hinzufügemethode fügt dann die Elemente hinzu und dann den nächsten Stapel. Dies wird fortgesetzt, bis keine weiteren Objekte hinzugefügt werden können. An diesem Punkt würden Sie den relevanten Teil Ihrer Benutzeroberfläche wieder aktivieren (ListView).

0

Da die meisten der oben genannten sind gute Ratschläge, aber nicht wirklich Ihr Problem zu lösen, hier ist ein anderer Ansatz: Dies wird Ihre GUI aktualisieren und reagieren. Angenommen, Sie sind in WinForm App?

 Application.DoEvents(); 
     this.Refresh(); 

Dennoch bedeutet dies nicht, dass vielleicht sollte man nicht von oben :-) zu den Ideen hören

+0

Es ist eine WinForm app - aber zurück in den VB6 Tagen wurde DoEvents verpönt, weil es könnte Ändern Sie die Reihenfolge der Ereignisse. Ist das in C# nicht der Fall? –

+0

Sie könnten Recht haben, es ist immer noch ein bisschen ein Hack von dem, was ich gehört habe. Hängt von der Komplexität Ihrer App ab. Ich habe meine letzte einfache App zu WPF umgeschrieben, das ist eigentlich ein wirklich nettes Framework. – Remy