Hi @ All,
ich hab mal wieder eine etwas "unschöne" Frage, und zwar, arbeite ich an einem Programm welches, sich mit der Webseite unserer Arbeit verbindet, sich dort einloggt, einen neuen Link aufruft wartet bis der geladen ist (mit picoflops Browser.NavigateAsync)
dann etwas aus dem Quelltext filtert, an sich funktioniert dies einwandfrei, allerdings immer ein Link nach dem anderen, jetzt wollte ich mich mal dransetzen und versuchen dies Multithreaded hinzubekommen (hier ist auch der unschöne Teil da ich CrossthreadCalls verwende)
allerdings bekomme ich es gar nicht erst zum laufen da er meckert :
Spoiler anzeigen
was genau ist denn damit gemeint ??
Aktueller Code (erstmal rufe ich nur einen Befehl im neuen thread auf da er ja nicht mal einen abarbeiten will...)
Spoiler anzeigen
wieso tritt dieser fehler auf und wie könnte ich diesen umgehen ?
Greets
p.S. es muss leider ein Webbrowser verwendet werden da die Webseite mit Zertifikaten arbeitet und ich es damals in Monatelangen Tests nur mit einem Browser entsprechend aufrufen konnte...
ich hab mal wieder eine etwas "unschöne" Frage, und zwar, arbeite ich an einem Programm welches, sich mit der Webseite unserer Arbeit verbindet, sich dort einloggt, einen neuen Link aufruft wartet bis der geladen ist (mit picoflops Browser.NavigateAsync)
dann etwas aus dem Quelltext filtert, an sich funktioniert dies einwandfrei, allerdings immer ein Link nach dem anderen, jetzt wollte ich mich mal dransetzen und versuchen dies Multithreaded hinzubekommen (hier ist auch der unschöne Teil da ich CrossthreadCalls verwende)
allerdings bekomme ich es gar nicht erst zum laufen da er meckert :
Eine Ausnahme vom Typ "System.Threading.ThreadStateException" ist in System.Windows.Forms.dll aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.
Zusätzliche Informationen: Das ActiveX-Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist.
Zusätzliche Informationen: Das ActiveX-Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2 kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist.
was genau ist denn damit gemeint ??
Aktueller Code (erstmal rufe ich nur einen Befehl im neuen thread auf da er ja nicht mal einen abarbeiten will...)
VB.NET-Quellcode
- Imports System.Environment
- Public Class Main
- Dim wb As New WebBrowser
- Dim res As String
- Dim old As String
- Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- CheckForIllegalCrossThreadCalls = False
- wb.ScriptErrorsSuppressed = True
- Clipboard.Clear()
- old = Clipboard.GetText
- timAutoInsert.Enabled = True
- End Sub
- Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
- 'ClearIDList()
- Dim t As Thread
- t = New Thread(Sub() GetState(rtbIDs.Lines(0)))
- t.Start()
- rtbErgebnisse.Text = res
- End Sub
- Private Sub rtbIDs_TextChanged(sender As Object, e As EventArgs) Handles rtbIDs.TextChanged
- lblIDCount.Text = "Zu prüfende IDs: " & rtbIDs.Lines.Count
- End Sub
- Private Sub ClearIDList()
- '// Id - Liste, leere Zeilen und leerzeichen entfernen ,falls vorhanden URL entfernen
- If rtbIDs.Text.Contains("https://payangocard.de/admin/orders/") Then
- rtbIDs.Text = rtbIDs.Text.Replace("https://payangocard.de/admin/orders/", "")
- End If
- rtbIDs.Refresh()
- rtbIDs.Lines = (From s As String In rtbIDs.Lines Where s.Length > 0 Select s).ToArray
- ReDim Preserve rtbIDs.Lines(rtbIDs.Lines.Count - 1)
- rtbIDs.Refresh()
- If rtbIDs.Text.Contains(" ") Then
- rtbIDs.Text = rtbIDs.Text.Replace(" ", "")
- End If
- rtbIDs.Refresh()
- rtbIDs.SelectionStart = 0
- rtbIDs.ScrollToCaret()
- rtbIDs.Refresh()
- '// Ende Id - Liste, leere Zeilen und leerzeichen entfernen ,falls vorhanden URL entfernen
- End Sub
- Private Async Sub GetState(ByVal ID As String)
- '// eigentliche Funktion
- Dim wsb As New WebBrowser
- wsb.ScriptErrorsSuppressed = True
- Await wb.NavigateTaskAsync("https://payangocard.de/session/new")
- wsb.Document.GetElementById("login").InnerText = "*"
- wsb.Document.GetElementById("password").InnerText = "*"
- wsb.Document.Forms(0).InvokeMember("submit")
- Do Until wsb.DocumentText.Contains("Sie wurden erfolgreich eingeloggt") _
- OrElse wsb.DocumentText.Contains("Bitte überprüfen Sie Ihr Passwort.") _
- OrElse wsb.DocumentText.Contains("Bitte überprüfen Sie Ihren Benutzernamen bzw. Ihre E-Mail-Adresse.") _
- OrElse wsb.DocumentText.Contains("Sie haben die maximale Anzahl der möglichen Loginversuche überschritten und sind für eine Stunde gesperrt.")
- Loop
- Await wsb.NavigateTaskAsync("https://payangocard.de/admin/orders/" & ID)
- Dim a As Match = Regex.Match(wsb.DocumentText, "Status: ([^\(]*)", RegexOptions.IgnoreCase)
- If (a.Success) Then
- Dim key As String = a.Groups(1).Value
- res = res & NewLine & key
- End If
- Close()
- '// Ende eigentliche Funktion
- End Sub
- Private Sub timAutoInsert_Tick(sender As Object, e As EventArgs) Handles timAutoInsert.Tick
- If Clipboard.GetText <> old Then
- rtbIDs.Text = rtbIDs.Text & Clipboard.GetText & NewLine
- rtbIDs.SelectionStart = rtbIDs.Text.Length
- rtbIDs.ScrollToCaret()
- Clipboard.Clear()
- old = Clipboard.GetText
- End If
- End Sub
- Private Sub chbCopy_CheckedChanged(sender As Object, e As EventArgs) Handles chbCopy.CheckedChanged
- If timAutoInsert.Enabled = True Then
- timAutoInsert.Enabled = False
- ElseIf timAutoInsert.Enabled = False Then
- Clipboard.Clear()
- old = Clipboard.GetText
- timAutoInsert.Enabled = True
- End If
- End Sub
- End Class
wieso tritt dieser fehler auf und wie könnte ich diesen umgehen ?
Greets
p.S. es muss leider ein Webbrowser verwendet werden da die Webseite mit Zertifikaten arbeitet und ich es damals in Monatelangen Tests nur mit einem Browser entsprechend aufrufen konnte...
If Energy = Low Then
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If