backgroundworker beliebig viele Threads erstellen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    backgroundworker beliebig viele Threads erstellen

    Guten Morgen,

    Ich überlege schon eine weile, wie man mit dem Backgroundwoker beliebig viele Threads erstellen kann.
    Ich möchte, das die Progressbar gleichzeit mit dem Counter hoch geht.<-- brauch man dafür mehrere Backgroundwoker?



    Der Code siet so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub test()
    3. For i = 0 To 100
    4. System.Threading.Thread.Sleep(50)
    5. BackgroundWorker1.ReportProgress(i)
    6. Next
    7. End Sub
    8. Private Sub test1()
    9. For i = 0 To 100
    10. ' System.Threading.Thread.Sleep(50)
    11. BackgroundWorker1.ReportProgress(i)
    12. Label1.Text = i & "/ 100"
    13. Next
    14. End Sub
    15. Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    16. Call test()
    17. Call test1()
    18. End Sub
    19. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    20. BackgroundWorker1.RunWorkerAsync()
    21. End Sub
    22. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    23. ProgressBar1.Value = e.ProgressPercentage
    24. End Sub
    25. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    26. MessageBox.Show("Fertig")
    27. End Sub
    28. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    29. End Sub
    30. End Class


    Hier im code, bei Call test1() kommt ein Error, wenn man die Funktion aufruft:

    Es wäre ja unpraktisch , bei jedem Thread einen Backgroundwoker zu erstellen.

    Wüsste hier jemand wie das geht mit einem Backgroundwoker mehrere Threads zu starten, oder muss ich was anderes suchen?

    mfg,
    Timm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „timmlanhd11“ ()

    Eine Instanz der BackgroundWorker-Klasse stellt eine Aufgabe dar, die asynchron zum Hauptthread ausgeführt wird. Also stellt eine Backgroundworker-Instanz einen eigenen Thread dar. Willst Du 100 Threads, so brauchst Du 100 Backgroundworker-Instanzen. Über Sinn oder Unsinn lass ich mich jetzt nicht aus, da ich davon ausgehe, dass dies nur zur Übung dient.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @timmlanhd11: Meinst Du so was:
    ProgressBar füllen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. BackgroundWorker1.RunWorkerAsync()
    4. End Sub
    5. Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    6. BackgroundWorker1.ReportProgress(0)
    7. For i = 1 To 100
    8. System.Threading.Thread.Sleep(30)
    9. BackgroundWorker1.ReportProgress(i)
    10. Next
    11. End Sub
    12. Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    13. ProgressBar1.Value = e.ProgressPercentage
    14. End Sub
    15. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    16. MessageBox.Show("Fertich")
    17. ProgressBar1.Value = 0
    18. End Sub
    19. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    SpaceyX schrieb:

    Über Sinn oder Unsinn lass ich mich jetzt nicht aus, da ich davon ausgehe, dass dies nur zur Übung dient.
    na, denn ich eben:
    Die goldene Regel "Viel hilft viel" stimmt leider nicht immer, und auch bei Threading nicht.
    Geschwindigkeit gewinnt man durch Threading nur soweit, bis alle Cpu-Kernel beschäftigt sind.
    Weitere Threads sind zwar möglich, aber davon wird der Kernel auch nicht schneller, sondern muß seine Power dann eben auf 2 Threads verteilen, was in Summe aufs selbe rauskommt (auf weniger, denn die Thread-Verwaltung kostet auch!).
    Viele Threads haben nur Sinn, wenn sie in blockierenden Funktionen rumdümpeln, wie etwa ein TCPClient, der nix tut, als auf DatenEingang zu warten.
    Aber für solche Fälle ist der BGW ganz ungeeignet, und man nehme unbedingt das asynchrone Entwurfsmuster, oder das neumodische Async-Paradigma.

    Jo - wennichrecht überlege: BGW ist eiglich so tot wie olle ArrayList von 2003. Arbeite dich lieber in den Async-Pattern ein.
    Vielleicht erzählt uns der TE mehr Einzelheiten über sein Vorhaben, dann haben wir auch bestimmt eine hochperformante und elegante Lösung.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    VincentTB schrieb:

    dass der BGW den Progress reportet?
    Klar, aber die Designer-Properties hab ich gekonnt verschwiegen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ah ok, also ich habs jetzt so verstanden, dass man mit einem Backgroundwoker nicht beliebig viele Threads erstellen kann.

    Mhh. habe es auch schon mit

    VB.NET-Quellcode

    1. Imports System.Threading
    versucht.. hier kann ich keine Parameter an die Sub übergeben . weil wenn ich dann Sub c1(ByRef nummer As String) nehme, bekomme ich beim

    VB.NET-Quellcode

    1. Dim myc1 As New Threading.Thread(AddressOf c1)
    eine Große Fehler meldung ( )

    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class Form1
    3. Dim firstcounter As Threading.Thread
    4. Sub c1()
    5. Dim c1_counter As Integer = 0
    6. For i = 0 To 20 Step +1
    7. Threading.Thread.Sleep(1000)
    8. Label1.Text = i & " / 100"
    9. Next
    10. End Sub
    11. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    12. CheckForIllegalCrossThreadCalls = False
    13. Dim myc1 As New Threading.Thread(AddressOf c1)
    14. myc1.Start()
    15. End Sub
    16. End Class


    Also, wie schaffe ich es, das man einen Paramter an die sub übergibt?

    timmlanhd11 schrieb:

    VB.NET-Quellcode

    1. CheckForIllegalCrossThreadCalls = False

    Aua

    Zu deinem Fehler. Bei deinem jetztigen Code darf kein Fehler auftreten. Aber wenn du in der Signatur von c1 eine nummer mitgeben willst, muss diese vom Typ Object sein und wird bei .Start("DieNummer") angegeben.

    Hier ein Beispiel:

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Public Class Form1
    3. Sub c1(nummer As Object)
    4. Dim MeineNummer = Integer.Parse(nummer)
    5. 'Mach was
    6. End Sub
    7. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    8. Dim myc1 As New Threading.Thread(AddressOf c1)
    9. myc1.Start(12)
    10. End Sub
    11. End Class
    Mfg
    Vincent

    Danke für das Beispiel, wüsste sonnst wieder die hälfte nicht.

    Jetzt bekomme ich aber einen Fehler, wenn ich bei 'machwas ein Label verändern möchte. ( error : Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.)

    timmlanhd11 schrieb:

    dass man mit einem Backgroundwoker nicht beliebig viele Threads erstellen kann.
    So isses.
    Mach Dir eine Klasse mit einem BGW, besser ein System.Threading.Thread), pack da das Handling und die "Arbeit" rein und erstell Dir beliebig viele Instanzen dafür.
    Wofür brauchst Du denn so viele Instanzen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!