Laden...

DGV aus Datei füllen, ohne dass das GUI blockiert

Erstellt von SlyFox vor 10 Jahren Letzter Beitrag vor 10 Jahren 911 Views
Thema geschlossen
S
SlyFox Themenstarter:in
231 Beiträge seit 2007
vor 10 Jahren
DGV aus Datei füllen, ohne dass das GUI blockiert

Hallo,

ich gebe zu, mich noch nie mit Multithreading beschäftigt zu haben, da es bisher nicht notwendig war.

Jetzt ist es aber notwendig.

Ich habe eine knapp 100 MB große Textdatei, mit etwas mehr als 1,2 Millionen Zeilen.

Ich lese die Daten zeilenweise ein, da ich prüfen muss, ob die Zeile überhaupt verarbeitet werden soll.

Die Ausgabe der benötigten Zeilen erfolgt dann in ein DataGridView.

Wenn ich das ohne Multithreading mache, "friert" das Fenster ein, bis die Verarbeitung abgeschlossen ist.

Jetzt meine Frage: mit welcher Art von Multithreading kann ich

  • die Daten zeilenweise aus der Datei lesen und vearbeiten
  • sie in das DataGridView schreiben

ohne dass mir die einzelnen Threads das DGV zerschießen? Die Ausgabe muss in der Reihenfolge wie in der Textdatei sein.

Vielen Dank für eure Hilfe

Christoph
P.S.: Ich habe mich zu dem Thema schon mal ein wenig eingelesen, aber irgendwie hat mir folgender Text nicht wirklich weiter geholfen: Multithreading in C#

16.806 Beiträge seit 2008
vor 10 Jahren
  1. Parallele Zugriffe auf lokale Dateisysteme ohne RAID sind in Sachen performance kontraproduktiv; es wird langsamer
  2. [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
F
10.010 Beiträge seit 2004
vor 10 Jahren

-sie in das DataGridView schreiben

Ganz bestimmt nicht. Die Daten haben im DGV nichts zu suchen.

Gerade für so eine Aufgabe hat das DGV den Virtuellen Modus, und wie der Funktioniert ist hier duzend fach beschrieben.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo SlyFox,

wie man Controls (mit vielen und/oder "langwierig" zu beschaffenden Daten) füllt, ohne dass das GUI blockiert, ist in der FAQ umfassend beschrieben. In dem oben genannten Link und in [FAQ] Warum blockiert mein GUI? sowie in Controls in anderem Thread erzeugen als das Form [==> auf keinen Fall / Liste der Alternativen] (aus der FAQ verlinkt).

Bitte beachte zu diesem Teil [Hinweis] Wie poste ich richtig? Punkt 1.1.

Ein einzelner Worker-Thread ist ausreichend, um das Blockieren zu verhindern. Und es ist unwahrscheinlich, dass mehr als ein Worker-Thread das reine Verarbeiten der Zeilen beschleunigt, da der Falschehals vermutlich eh das Einlesen der Datei sein wird.

Damit stellt sich dann die Frage, wie man die Reihenfolge der Zeilen behält, gar nicht mehr.

Wenn doch, dann muss könnte jeder Worker einen bestimmten Teil der Datei bearbeiten und seine Zeilen in eine eigene Liste packen. Wenn alle Worker fertig sind, muss man dann nur die Listen in der Reihenfolge der Teile zusammenhängen. Der Worker, der den ersten Teil bearbeitet, könnte seine Ergebnisse auf direkt ins DGV "füllen" (oder wie FZelle sagt, eben nicht füllen sondern nur zur Verfügung stellen).

herbivore

Thema geschlossen