| 

.NET C# Java Javascript Exception

5
Hallo zusammen,

Folgende Problemstellung:

Es gibt eine ListView in welcher Dateien und Detaildaten angezeigt werden (Dateiname in die erste Spalte, die Detaildaten in weiteren Spalten). Die Detaildaten selbst stehen in den Dateien und sollen in einem separaten Thread im Hintergrund nachgeladen werden.

Das Nachladen soll in Blöcken (iterativ) geschehen. Also beispielsweise Detaildaten von 10 Dateien laden und anzeigen, dann die nächsten 10 usw... so, dass der Benutzer möglichst schnell die Daten sieht.

Außerdem soll der Beutzer andere Verzeichnisse auswählen können, dessen Inhalt dann in der ListView angezeigt wird. In diesem Fall muss der Ladeprozess ggf. abgebrochen und für das neue Verzeichnis neu gestartet werden.

Ansatz:
Der erste Ansatz ist die Verwendung eines Backgroundworkers. Durch das iterative Nachladen müsste der aber mehrfach gestartet werden wodurch es etwas mühselig ist zu prüfen ob er noch läuft.

Wie würdet Ihr das realisieren? Gibt es alternativ zum Backgroundworker noch einen Lösungsweg der besser für diese Problemstellung geeignet ist?
12.07.2011
Tachyon 690 1 7
2 Antworten
4
Ich würde hier als Pendant zum BackgroundWorker Threading nutzen. So blockierst du ebenfalls nicht die Form und kannst sogar gleich mehrere Threads starten, was auch noch performanter ist.

Diese können das Ergebnise dann über ein Delegate an deine Applikation schicken, wo du die Daten dann in die ListView schreiben kannst. Das ganze kanns tdu natürlich auch dynamisch machen, indem du die Anzahl an Dateien durch 10 teilst und über eine Schleife dann diese Anzahl an Threads erstellst.

Alternativ kannst du auch mit Tasks und einer TaskFactory arbeiten...

  • Beispiel zu Threading: Link
  • Informationen zur TaskFactory: Link


// EDIT
Link hinzugefügt
12.07.2011
Dustin Klein 2,9k 2 9
2
Der Background-Worker ist Threading und blockiert nicht die Form.
CodeSniffer 12.07.2011
Ja, sollte nicht so rüberkommen, dass der BGW die Form blockiert, habe den Absatz entsprechend angepasst.
Dustin Klein 12.07.2011
1
Danke für deine Antwort. Auf das Laden in mehr als einem Hintergrundthread kommt es mir garnicht so an. Der Flaschenhals ist das Laden der Daten von der Platte, von daher würde das vermutlich keinen großen Geschwindigkeitsvorteil bringen. Es geht eher darum, dass die Funktion nicht die GUI blockt, iterativ funktioniert und einfach abgebrochen werden kann. Ich schau mir mal die TaskFactory an.
Tachyon 12.07.2011
4
Hallo Tachyon,

ich würde die Detaildaten in eine zweite ListView packen.
Immer wenn der Anwender in der ListView die Selektion ändert würde ich die Detaildaten in einem BackgroundWorker laden und aktualisieren.
Das belastet auch nicht so sehr den Speicher.

Man kann das ganze noch optimieren, dass man die Details-Daten erst nach 333 Millisekunden nach Selektionsänderung aktualisiert.
Somit bekommst Du keine Probleme wenn der Anwender schnell über Cursor-Down-Taste scrollt.

Falls Du bei Deinem Ansatz bleiben möchtest:
Fülle erst die ListView komplett ohne Details-Daten.
Dann sind sie schnell sichtbar. Danach kannst Du den Background-Thread starten und die Details-Daten stückweise nachliefern.

Gruß

CodeSniffer
12.07.2011
CodeSniffer 1,3k 4 9

Stelle deine Threading-Frage jetzt!