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
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#
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
-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.
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