Benutzer mit den meisten Antworten
Mehrere Backgroundworker gleichzeitig

Frage
-
Hallo
Ich versuche gerade eine Klasse zu schreiben, die insgesamt 15 Dateien gleichzeitig einliest.
Das Einlesen der Dateien überlasse ich einer externen DLL von FileHelpers (http://filehelpers.sourceforge.net/)
Die Klasse ist so gestaltet, dass alle 15 BackgroundWorker gleichezitig gestartet werden.
Die Sub von DoWork jedes einzelnen BackgroundWorker sieht sehr ähnlich aus. Hier ein Bsp.:
Private Shared Sub BkwHeadDoWork(sender As Object, e As DoWorkEventArgs) Try Dim myEngine As New FileHelperEngine(GetType(Head)) ' myFiles wird außerhalb der Sub definiert, ' deshalb ein SyncLock SyncLock myFiles Dim headClass = myFiles.Where(Function(file) file.DisplayName = HeadFileInfo).Single If headClass.IsLoaded = True Then Dim engineContent() = myEngine.ReadFile(System.IO.Path.Combine(MainFolder, headClass.FileName)) Dim cnt As Integer = 0 For Each content As Classes.V6101.Head In engineContent headConverted.Add(New Classes.V6101.Head With {.Feldname = content.Feldname, _ .Feldwert = content.Feldwert}) cnt += 1 RaiseEvent HeadReportProgress((cnt / myEngine.TotalRecords) * 100) Next End If End SyncLock Catch ex As Exception End Try End Sub
Das interessante daran ist, daß die ersten 3 BackgroundWorker die gestartet werden auch super funktionieren, aber ALLE anderen, bekommen immer eine NULL Exeption schon bei der Definition von "myEngine"
Kann mir jemand sagen, woran das liegt!? - Darf man nur 3 BackgroundWorker gleichzeitig ausführen, Bin für jeden Tipp dankbar!
Antworten
-
Hi Zero-G,
wenn du mit mehreren Threads solltest du den ThreadPool verwenden.
Ob es für den BackgroundWorker eine maximale Anzahl von Threads gibt weiß ich ehrlich gesagt nicht.
Das mit den 15 BWs wird übrigens keinen Performance Vorteil bringen wenn du nicht gerade 15 Festplatten in deinen Rechner hast (Eine entsprechende Anzahl von Prozessor Kernen wäre auch nicht schlecht). Ansonsten wird es eher länger dauern das das erstellen eines Thread ja auch immer Rechenleistung braucht.
MFG
Björn
Alle Antworten
-
Hi Zero-G,
wenn du mit mehreren Threads solltest du den ThreadPool verwenden.
Ob es für den BackgroundWorker eine maximale Anzahl von Threads gibt weiß ich ehrlich gesagt nicht.
Das mit den 15 BWs wird übrigens keinen Performance Vorteil bringen wenn du nicht gerade 15 Festplatten in deinen Rechner hast (Eine entsprechende Anzahl von Prozessor Kernen wäre auch nicht schlecht). Ansonsten wird es eher länger dauern das das erstellen eines Thread ja auch immer Rechenleistung braucht.
MFG
Björn
-
... und das parallele Lesen/Kopieren von mehreren Dateien kann man sich schön veranschaulichen, indem man mehrere größere Ordner nicht gemeinsam selektiert und kopiert, sondern jeden Ordner einzeln, aber sie gleichzeitig startet. Das Ergebnis: die "voraussichtliche Zeit" steigt ins unermessliche und der Lesekopf der Festplatte bekommt einen "Herzinfarkt". :-)
Solang es Prozesse sind, die einfach nur im Speicher arbeiten und irgendwas ausgeben, würde ich das so machen, wie du beschreibst. Aber niemals bei physikalischen Zugriffen auf die Platte.
Es sei denn, du liest partiell, und bereitest die Daten dann noch auf, d.h. das Lesen einer größeren Menge Daten wird immer wieder von längeren Ruhephasen (auf die Festplatte bezogen) unterbrochen. In dem Fall könnte man eine globale Variable "Reading" setzen, die immer auf True ist, solange ein Thread liest, und man so sowohl verhindert, dass mehrere parallel lesen, als auch die "Zwischenphasen" ungenutzt bleiben.
LG, Dennis.