Ich schreibe gerade eine Applikation welches massenhaft Regex Operationen über Dateinamen (Über 100k) macht und das über 10 threads verteilt. Die Ergebnisse werden in eine Listview gespeichert. Pro Datei hab ich so aktuell 10 regexe die überprüft werden, somit dauert der vorgang schon ein paar sekunden. Tendenziell steigen die Anzahl der Regexe pro Datei, weswegen ich gerade versuche einen Progress anzuzeigen.
Leider klappt das mit dem Progress nicht lange. Irgendwann aktuallisiert sich die UI nicht mehr.
Das war die kurzfassung.
Nun wie ich das ganze implementiert habe:
Ich habe einen Hauptthread, der mittels eines Start/Stop button gestartet, abgebrochen werden kann mit Lowest Priority und IsBackground = True.
Sobald der Thread anläuft, dann werden weitere 10 Threads erzeugt und gestartet die in einem Array zwischengespeichert werden und wartet in einer while loop solange bis alle Threads fertig sind.
Jeder dieser Threads enthält eine Queue und durchläuft diese. Der Thread ist in einer Klasse gekapselt, damit ich den Queue.Count abfragen kann. Jeder dieser Threads enthält eine Referenz auf ein Listview und schreibt bei bedarf dort auch Einträge rein. Mehr passiert in diesen 10 Threads nicht.
In der While-Loop des Hauptthreads wird, sobald geguckt wurde, wieviel threads noch laufen, der aktuelle fortschritt in einer Progressbar sowie ein paar statistics infos in label ausgegeben. Danach wird der Thread 100 msecs schlafen gelegt, es reicht mir wenn ich jede 100 msec ein update bekomme.
Mein Problem ist ja wie oben beschrieben, die Labels sowie die Progressbar aktuallisiert nicht mehr und die UI reagiert nicht mehr. Ein Application.DoEvents hat leider auch nicht geholfen.
Wie kann ich das in den Griff kriegen, so das die UI reagiert auch wenn meine Threads einiges zu tun haben und auch im UI sachen verändern dürfen ?
So es beginnt alles mit der Methode "ScanTitles(ICollection<FileEntry> ientries)". Da drin ab dem kommentar "Fill threads with titles" werden die 10 Threads erzeugt mit Dateien gefüllt die aus "ientries" kommen und gestartet.
Danach beginnt die while-loop für den Haupt thread die die UI aktuallisiert.
Der eigentliche Thread code für die unter thread befindet sich in der Klasse "TitleThread" unter der Methode "ThreadProc".
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.