WebBrowser in extra Thread startet nicht das Downloadcomplete Event

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

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

    WebBrowser in extra Thread startet nicht das Downloadcomplete Event

    Hallo zusammen,

    ich habe folgendes Problem:

    Das Downloadcomplete Event ladet im Sub des neues Threads nicht.

    Wenn ich davor eine Messagebox.Show einfüge testweise funktioniert es. Allerdings wenn ich die Test Messagebox.Show Weglasse geht es nicht

    Button das den Thread startet:

    VB.NET-Quellcode

    1. Dim ThreadX As New Thread(AddressOf MTX)
    2. ThreadX.SetApartmentState(ApartmentState.STA)
    3. ThreadX.Start()


    Der Thread inklusive neuem Webbrowser Element: (URL dient als Beispiel, gleiches Ergebnis)

    VB.NET-Quellcode

    1. Sub MTX()
    2. Dim WB1 As New WebBrowser
    3. WB1.ScriptErrorsSuppressed = True
    4. WB1.Navigate(New Uri("https://google.at"))
    5. Reload:
    6. MessageBox.Show("OK1") 'so lange diese Messagebox drin ist funktioniert es, und die Funktion hinter If WB1.ReadyState = WebBrowserReadyState.Complete Then wird auch geladen sobald es fertig geladen hat.
    7. If WB1.ReadyState = WebBrowserReadyState.Complete Then
    8. MessageBox.Show("LOADED")
    9. Else
    10. Thread.Sleep(500)
    11. GoTo Reload
    12. End If
    13. End Sub


    Ich habe es mit einem Do While Loop auch schon Probiert, erfolglos. Hat irgendwer noch eine Idee?

    Die GoTo Reload Funktion geht auch wenn die Messagebox "OK1" nicht da ist. Allerdings Ändert sich da der WB1.ReadyState nicht und bleibt dauerhaft auf 0. Das gleiche wenn ich WB1.Documenttext.Length > 0 setzte. Gleiches Problem

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Downloadcomplete-Event scheint es beim WebBrowser nicht zu geben. Es gibt ein DocumentCompleted-Event.
    Meinst Du das oder meinst Du ein anderes Control?

    Welches Event auch immer Du verwendest: Da Du es nicht abonnierst, also es nicht mit einem EventHandler verbindest, kann der EventHandler auch nicht ausgelöst/aufgerufen werden.

    Das Ganze funktioniert prinzipiell auch gar nicht. Du stoppst das Navigieren des WebBrowsers durch Thread.Sleep. Gegenvorschlag:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. MTX()
    3. End Sub
    4. Async Sub MTX()
    5. Dim WB1 As New WebBrowser With {.ScriptErrorsSuppressed = True}
    6. WB1.Navigate(New Uri("https://google.at"))
    7. Do Until WB1.ReadyState = WebBrowserReadyState.Complete
    8. Await Threading.Tasks.Task.Delay(500)
    9. Loop
    10. End Sub

    Statt einer Do-Schleife wäre aber eine For-Schleife besser, damit es notfalls nicht unendlich lange dauert, wenn es Probleme mit der Seite gibt, sondern dass nur z.B. 5x500 ms gewartet werden und dann eine Hinweis/-Fehlermeldung angezeigt wird.


    btw: GoTo? Echt jetzt?
    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.

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

    hasexxl1988 schrieb:

    VB.NET-Quellcode

    1. Dim WB1 As New WebBrowser
    Diese Zeile solltest Du aus der Prozedur in die Klasse verschieben. Füge der Deklaration WithEvents hinzu und Du kannst alle erforderlichen Events mit Handles abonieren.
    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!