BackgroundWorker beendet sich von selbst

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    BackgroundWorker beendet sich von selbst

    Ich rufe in meinem Project einen Backgroundworker auf (

    VB.NET-Quellcode

    1. Private Sub Test_btn_Click(sender As Object, e As EventArgs) Handles Test_btn.Click
    2. PSBackgroundWorker.RunWorkerAsync()
    3. End Sub


    dieser führt aber nichts bis auf das erste MsgBox("Test1") auf. (Wenn ich die Msgbox entferne, führt er gar nichts aus.)
    In meinem gesamten Project, stoppe ich nirgendswo den BackgroundWorker, und ich habe diese Eigenschaft auch deaktiviert.
    PS:Wenn ich den Inhalt des Backgroundworker so ausführe, treten keinerlei Probleme auf, und alles funktioniert wie es soll!
    Wie kann es also sein, das dort nix ausgeführt wird/er sofort abbricht.


    VB.NET-Quellcode

    1. Private Sub PSBackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles PSBackgroundWorker.DoWork
    2. Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    3. MsgBox("Test1")
    4. FriendListView.Items.Clear()
    5. MsgBox("Test2")
    6. Using WC As New Net.WebClient()
    7. Dim XMLDATA As New Xml.XmlDocument
    8. MsgBox("Test3")
    9. For Each i As String In My.Settings.Friends
    10. XMLDATA.LoadXml(WC.DownloadString("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&steamids=" & i & "&format=xml"))
    11. My.Settings.FriendsName.Add(XMLDATA.SelectSingleNode("//response//players//player//personaname").InnerText)
    12. Next
    13. MsgBox("Test4")
    14. For Each i As String In My.Settings.FriendsName
    15. FriendListView.Items.Add(i)
    16. FriendListView.Items(FriendListView.Items.Count - 1).SubItems.Add("Temp Status")
    17. Next
    18. MsgBox("Test5")
    19. End Using
    20. End Sub
    Das hier vorweg:

    1) Visual Studio - Empfohlene Einstellungen
    2) Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen

    Nun zu deinem Problem:

    Aus einen BackgroundWorker/Thread sollte niemals die UI modifiziert werden, gar eine MessageBox angezeigt werden.
    Zum downloaden von Dateien würde sich hier die WebClient.DownloadStringAsync()-Methode anbieten: https://msdn.microsoft.com/de-de/library/system.net.webclient.downloadstringasync(v=vs.110).aspx

    Edit: Was passiert denn wenn du den Code so ausführst? Also nicht im BackgroundWorker... bekommst du eine Fehlermeldung?
    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    @Neo127 Pack den Code in eine Button_Click und debugge ihn. Gugst Du hier.
    Und dann arbeite, wie @BornToBeRoot schon sagte, mit DownloadAsync().
    Debug-Ausgaben machst Du mit Console.WriteLine(...), der Text erscheint im Output-Tab unter dem Code-Fenster des Studios.
    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!
    @BornToBeRoot Ich bekomme keinerlei Fehlermeldungen, wenn ich den Code z.B in einem Button oder Timer ausführe.
    Mein Problem ist nur das 46 mal eine Datei runtergeladen werden muss, und in dieser ein Wert rausgesucht werden muss.
    Dies läst das Form für 4 bis 5 sec einfrieren.
    Da dies aber in einem Timer jede ~20 sec ausgeführt wird, wäre dies extrem nervig.
    @Neo127 Du sollst den Code in der Button_Click debuggen, also von Fehlern befreien, nicht dort permanent laufen lassen. :D
    Wenn der Code in einer Button_Click läuft, sehe ich keinen Anhaltspunkt, warum er im BGW nicht laufen sollte.
    Was machen die Debug-Ausgaben?
    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!
    Egal was ich dort reinschreibe, alles bis auf MsgBox() wird einfach nicht ausgeführt, sondern es wird einfach abgebrochen.
    Beim debugen kann ich dort jede Zeile mit "Pause Punkten"(ka wie man die nennt) voll klatschen.
    Er bleibt bei der MsgBox stehen, und im nächsten Schritt ist er schon draußen.

    PS: Ja @RodFromGermany mit "im Button" meine ich Button_click :D
    @Neo127: Auch wenn die anderen schon bessere Lösungen genannt haben. Deine erste GUI-bearbeitende Codezeile FriendListView.Clear() im Backgroundworker führt bei mir schon zu einer System.InvalidOperationException: "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement FriendListView erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."
    -> wie @BornToBeRoot bereits schrieb: niemals die GUI durch einen anderen Thread als den Hauptthread ändern (solange man nicht weißt, wie man es richtig macht)
    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.

    Neo127 schrieb:

    und im nächsten Schritt ist er schon draußen.
    Dann mach mal zum Testen ein Try / Catch drum.
    Da solltest Du eine qualifizierte Fehlermeldung bekommen, so was z.B.:

    VaporiZed schrieb:

    "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement FriendListView erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."
    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!
    @Skybird da bin ich ganz Ohr :)
    Bisher sammel ich aus der XML "http://api.steampowered.com/ISteamUser/GetFriendList/v0001/?key=2GANZVIELEZEICHEN04429&steamid=12345"&relationship=friend&format=xml"
    die Steam Freundes IDs, und setze diese in die URL "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=EGANZVIELEZEICHEN04429&steamids=STEAMIDS&format=xml"
    ein, und nehme mir dort aus der XML den Namen raus.

    Wie kann ich dies denn in einem einzigen Request tun.
    Dies würde mein Project deutlich nach vorne bringen :)

    @BornToBeRoot Daran habe ich auch schon gedacht, jedoch da ich mit DownloadStringCompleted arbeiten muss,verkompliziert sich alles deutlich.(Wenn ich nicht irgend was total offensichtliches übersehe)
    Zudem bekomme ich die Fehlermeldung beim DownloadStringCompleted
    ​ "Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler BC30506 Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird."



    Mit Freundlichen Grüßen Fabian Schuchhardt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Neo127“ ()

    Huhu, schau dir doch mal die API-Dokumentation genauer an. Die Funktion GetPlayerSummaries nimmt neben dem Format auch bis zu 100 durch Komma getrennte Steam-IDs an.

    Neo127 schrieb:


    "api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=EGANZVIELEZEICHEN04429&steamids=STEAMIDS&format=xml"



    //Kommentar