none
Mehrere Backgroundworker gleichzeitig RRS feed

  • 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!

    Freitag, 21. September 2012 07:31

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


    • Bearbeitet Palin Freitag, 21. September 2012 07:54
    • Als Antwort markiert Zero-G. _ Freitag, 21. September 2012 07:59
    Freitag, 21. September 2012 07:54

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


    • Bearbeitet Palin Freitag, 21. September 2012 07:54
    • Als Antwort markiert Zero-G. _ Freitag, 21. September 2012 07:59
    Freitag, 21. September 2012 07:54
  • ... 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.

    Montag, 24. September 2012 07:47