Hallo Community
Eins vorweg: ich verwende .NET 2.0 Beta
Ich hab mir mithilfe der WebBrowser klasse (die super funktioniert) zugriff auf diverse pages verschaffen, ohne auf threads zu achten.
Login und Datenauslesen mit Regex funktioniert super. Jetzt will ich allerdings die Abfragen in einem Thread im Hintergrund abhandeln, damit ich die windows.forms aktualisieren kann, ohne dass sie "nicht reagieren". Ich habe die neue Klasse BackgroundWorker gefunden und sofort ausprobiert, allerdings funktionierte es nicht wirklich.
Ich denke, dass hier einige sich schon mit der neuen WebBrowser Klasse auseinandergesetzt haben, darum will ich euch fragen, wie ihr dieses Threadproblem gelöst habt. Das auslesen der Daten erfolgt schlussendlich immer in dem DocumentCompleted event, nur muss man ja warten, bis dieser Event gefeuert wird.
Es muss nicht dringend ein Codebeispiel her, es geht mehr um den Grundgedanken, und vieleicht ein zwei kleine Snippets.
Gruss,
.unreal
Hallo .unreal,
das WebBrowsser-Control selbst blockiert ja das GUI- bzw. den GUI-Thread nicht. Also wenn du eine Url setzt, wird die im Hintergrund geladen und erst wenn sie fertig geladen ist, feuert DocumentCompleted. Wenn du jetzt in DokumentCompleted z.B. nur ein Eingabefeld per Id heraussuchst, mit Text füllst und einen Button clickst. Dann sind diese Aktionen so kurz, dass du sie direkt in DocumentCompleted ausführen kannst, ohne das da was blockiert. Wenn du dagegen z.B. eine aufwändige Analyse über den HTML-Text machen willst, dann musst du genau diese Aktion in einen Thread verlagern. Es ist aber grundsätzlich egal, ob wir über WebBrowser.DokumentCompleted oder Button.Click reden. Jede lange Aktion, die in einem EventHandler (eines Controls) ausgeführt wird, blockiert das GUI. Jedenfalls sehe ich erstmal nichts webBrowser-spezifisches an deiner Frage.
HTH
herbivore
eine andere Frage zum WebBrowser:
Wenn eine Page mehrere Frames hat, wird der DocumentCompleted event mehrmals aufgerufen (ist auch logisch, es sind mehrere dokumente). Wie kann ich das umgehen? Weil der Event mehrmals gefeuert wird, krieg ich die geparsten Daten immer doppelt und mehrfach. Gibt es ein Attribut, oder muss ich selber ein Flag setzten?
Gruss,
.unreal
Hallo .unreal,
nein, aber du bekommst in den EventArgs übergeben, welche Url completed ist. Und die Url von dem Frameset feuert als letzte das DocumentCompleted.
herbivore