Dynamisches Nachladen von Daten

FwDonnerbalken

Erfahrenes Mitglied
Moin zusammen,

folgende Szenario ist gegeben. Ein ListView-Control mit einer Reihe von Items und angezeigten Checkboxen. Sobald ein Item mit einem Haken markiert wird, werden Daten nachgeladen.
Dieses Nachladen dauert ca. 1-2 Sekunden (es wird ein Query an einen SQL-Server abgesetzt). Aufgrund zu großer Datenmengen (> 200.000 Datensätze) will ich die Daten nicht im vorraus laden. Dies hatte ich vorher so gelöst und nun wieder verworfen.

Folgendes Problem, zu dem ich eine elegante Lösung suche:

Stellt man sich nun vor, dass der Benutzer mehrere Haken setzt, muss er zwischen den Klicks immer diese Zeit von 1-2 Sekunden, ist der SQL Server start ausgelastet eventuell sogar länger warten. Das ist nicht akzeptabel.

Die andere Möglichkeit ist, dass man die Haken einfach setzen lässt und im Anschluss einen Refresh-Button drückt. Dann könnten die Daten für alle gesetzten Haken nachgeladen werden. Das klingt zwar erstmal sinnig, leider muss man dann dem Benutzer erstmal wieder beibringen "Mache Haken und drücke dann Refresh". Wenn man sich nun zusätzlich vor Augen hält, dass sich in dem Fenster mit dem ListView noch andere Buttons befinden ist das ebenfalls recht unbefriedigend.

Letztere Möglichkeit, die ich mir vorgestellt hatte ist. Warte nach einem
gesetzten Haken wenige Zentelsekunden (extra Thread oder wie auch immer), wenn dann kein weiterer Haken gesetzt wird werden die Daten nachgeladen, andernfalls wird der "Wartezähler" wieder zurückgesetzt.


Mich würde einfach mal interessieren, welche Methode ihr bevorzugen würdet, ob ihr vielleicht noch eine andere Idee habt. Ich freue mich auf Antworten und eine belebte Diskussion ;-)
 
Hallo, starte doch für jeden gesetzten Haken einen eigenen Thread, der die Daten nachlädt.

Gruß
MCoder
 
Ich würde, wie bereits von dir beschrieben, die Timer-Thread Möglichkeit bevorzugen.

Am Besten schreibst du dir eine Art LoaderHelper welchem du eine oder mehrere IDs übergeben kannst. Dieser führt die gewünschten Aktionen in einem BackgroundWorker durch und beim Complete gibt du einfach das Callback weiter.

In Kombination mit einem Timer wäre das ganze natürlich noch Performance-Schonender.
Kann aber auch beim Endanwender auf Ablehnung stoßen. Stell dir vor der Enduser will nur einen Eintrag laden, muss aber wieder 1-2 Sekunden warten bis die Daten geladen werden, und bis diese dann noch geladen sind kommt das ganze auf 3-4 Sekunden. Zehntelsekunden Timeouts wären sinnlos da kein User so schnell die Einträge wählen kann.

Aber das Laden in einem zusätzlichen Thread (oder BackgroundWorker) sollte es ermöglichen die Wartezeit visuell zu überbrücken.

Eventuell kannst du auch noch bei der Datenbank Performance rausholen. Denn selbst bei 200.000 Einträgen sollte bei einer richtigen Indizierung und Abfrage das Ganze nicht länger als 1 Sekunde dauern.

Bestes Beispiel ist das Board hier. Allein der PHP Bereich hat über 230.000 Beiträge und die Threads werden auch in stolzen ~0.3 Sekunden generiert. Und dazu kommen noch einige andere Queries als nur die Abfrage auf die Beiträge.

Gruß Daniel
 
Um dieses Thema abzuschließen: Nachdem die entsprechenden Tabellen ein paar vernünftige Indizes erhalten haben und der Code, der neben dem Laden der Daten für die Organisation des ListView etc. verwendet wurde eine wenig Refactoring erfahren hat, ist die Ladezeit auf ein Maß gefallen, welches akzeptabel ist.

Dennoch ein großes Dankeschön an euch ;)
 

Neue Beiträge

Zurück