Alle laufenden Backgroundworker beenden/oder doch Threads nehmen?

  • VB.NET

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

    Alle laufenden Backgroundworker beenden/oder doch Threads nehmen?

    Moin.
    Farge: Gibts ne Möglichkeit ALLE laufenden Backgroundworker auf einen schlag zu Chancel()n?

    LG
    GOOGLE ist mein Meister :)
    Klar. Man muss die halt beim instanzieren in eine gemeinsame Liste packen. Dann kannst du diese per Schleife durchgehen, prüfen ob der backgroundworker läuft und dann ggf. beenden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Bady Klar.
    Zunächst:
    Jeder Thread (auch ein BGW ist ein Thread) sollte seine Arbeit freiwillig beenden.
    Einen Thread "abzuschießen" wäre die Holzhammermethode, das wollen wir nicht diskutieren.
    Ein lange arbeitender Thread hat eine Kern-Prozedur und / oder eine "Endlosschleife", die üblicherweise automatisch beendet wird, wenn die Daten alle sind.
    Wenn Du ein zentrales Abbruch-Flag implementierst, teste einfach in der Kernprozedur / Schleife, ob das Flag gesetzt ist.
    Wenn ja, dann verlasse die Prozedur.
    Ggf. musst Du nacheinander mehrfach testen, wenn da verschachtelte Schleifen auftreten.
    Feddich.
    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!
    Gegenfrage: Wie würdest Du Dein Programm umschreiben*, welches auf viele Backgroundworker angewiesen ist?

    * also nicht im Sinne von: Codeänderung, sondern im Sinne von: beschreiben
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed

    @RodFromGermany
    Vielen Dank für die Lösung. Hab ich auch so gemacht.
    Jedoch frage ich mich, ob man es nicht statt den vielen BGW auch mit eigenen Threads erledigen kann.

    Da ich leider bisher nur mit BGWs gearbeitet hab, könnte ich etwas Hilfestellung benötigen.

    Also, dass man sagt, die Zahl im NumUpDown.Value soll so viele Threads erstellen wie angezeigt und die Threads die Arbeit sorgfältig abarbeiten lässt.
    Ich hab ein Codeschnipsel gefunden, dass genau das macht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ThreadList As New List(Of Thread)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Generate_Multithreading(New ThreadStart(AddressOf SecondSub))
    5. End Sub
    6. Public Sub Generate_Multithreading(ByVal targetSub As ThreadStart)
    7. For i = 0 To NumericUpDown1.Value - 1
    8. ThreadList.Add(New Thread(targetSub))
    9. Next
    10. For Each Thread In ThreadList
    11. Thread.Start()
    12. Next
    13. For Each Thread In ThreadList
    14. Thread.Join()
    15. Next
    16. ThreadList.Clear()
    17. End Sub
    18. Public Sub SecondSub()
    19. 'Mach dies und das ....
    20. End Sub
    21. End Class


    Wenn ich dass richtig verstehe wird in der for i schleife die Anzahl der zu erstellenden Threads in eine list of thread geschrieben.
    In der 2ten for each Schleife werden die thread gestartet.
    Und in der 3ten schleife? was macht die?
    Danach wird die Liste wieder geleert.

    Soweit funktioniert dass auch jedoch wüsste ich gern wie man der SecondSub parameter übergibt.
    zb:

    VB.NET-Quellcode

    1. Public Sub SecondSub(ByVal meintxt As String, ByVal neuetxt As String)
    2. 'Mach dies und das ....
    3. End Sub


    Aber dazu müsste ich ja in der Sub Generate_Multithreading schon angeben welchen Parameter der secondsub übergeben werden soll oder lieg ich da falsch?
    Wenn ja wie löse ich das am besten?
    Oder hat jemand einen anderen Ansatz für mich.

    Ziel ist es eine Textdatei pro Zeile einen Thread auf zu rufen zu bearbeiten und in eine neue txt zu schreiben.

    Vielen Dank für eure Unterstützung!
    GOOGLE ist mein Meister :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @Bady Ein BGW ist ein Thread, allerdings ein leicht handhabbarer Dinosaurier.
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Dessen bin ich mir mittlerweile bewusst xD. Meinte ja eigens erstellte Threads.

    LG
    GOOGLE ist mein Meister :)

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

    Bady schrieb:

    Meinte ja eigens erstellte Threads.
    Wenn die Threads, die Du da erstellen willst, iwie aufzählbar sind, wäre Parallel.For oder Parallel.ForEach eine Option für Dich?
    docs.microsoft.com/de-de/dotne…-simple-parallel-for-loop
    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!