2009-10-01 6 views
0

Crée un webbrowser dans un thread d'arrière-plan, puis est censé naviguer vers une URL et retourner un htmldocument, mais la navigation échoue pour une raison quelconque, une idée pourquoi?Pourquoi ce contrôle Webbrowser en arrière-plan ne parvient-il pas à naviguer?

REMARQUE: cela fait partie d'une classe où vous voyez ME.url ou moi. ... me.isrunning = booléen false par défaut me.url = uri de l'emplacement pour naviguer à

Public Function GetDOC(ByVal url As Uri) As HtmlDocument 
    If Me.IsRunning Then 
     Throw New Exception("Object Currently In use") 
    End If 
    htmdoc = Nothing 
    Dim cp As New Threading.Thread(AddressOf thrdowo) 
    cp.SetApartmentState(Threading.ApartmentState.STA) 
    cp.Start() 
    run = True 

    While run 

    End While 
    Return htmdoc 

End Function 

Private Sub thrdowo() 
    Dim cbl As New WebBrowser 
    'cbl.Url = Me.URL 
    cbl.Navigate("about:blank") 
    cbl.Navigate(Me.URL) 

    While cbl.IsBusy 

    End While 
    htmdoc = cbl.Document 


    run = False 
End Sub 

Répondre

2

Utilisez WebRequest plutôt que WebBrowser

Vous pouvez modifier votre implémentation à utiliser WebRequest.BeginGetResponse qui récupérera votre ressource de manière asynchrone sans avoir à gérer vous-même les threads.

1

Je ne suis pas expert avec le contrôle Webbrowser, mais je suis passé par la même chose il y a deux semaines. Le problème est que lorsque vous dites au Webbrowser de faire quelque chose (comme Naviguer, ou cliquez sur un bouton), il doit partir et faire son travail, y compris probablement, en attendant que les sites Web répondent à ses demandes. Cela se produit cependant de façon asynchrone, de sorte que le marteler plusieurs fois avec les appels Navigate échouera presque certainement. Ce que vous devez faire est de le faire fonctionner (Naviguer, etc.) et puis quitter votre thread actuel, et attendez que le Webbrowser termine ce que vous lui avez demandé de faire, et puis vous le dites en élevant un événement, puis vous pouvez passer à l'étape suivante. Donc, ce que je fais est d'avoir un objet qui maintient un état, et en fonction de l'état actuel, il fait quelque chose au Webbrowser, avance l'état, puis quitte le thread.

J'ai un autre objet (Formellement en fait) qui reçoit tous les événements du Webbrowser, détermine quand un événement signifie que le chargement est "terminé" et rappelle le premier objet.

Questions connexes