为什么这个后台webbrowser控件无法导航?

时间:2009-10-01 22:00:49

标签: .net vb.net

在后台线程中创建一个webbrowser,然后应该导航到一个url并返回一个htmldocument,但由于某种原因导航失败,任何想法为什么?

注意:这是您看到ME.url或我的课程的一部分。 ... 默认情况下,me.isrunning = boolean false me.url = uri的位置导航到

 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

2 个答案:

答案 0 :(得分:2)

使用WebRequest而不是WebBrowser

您可以更改您的实现以使用WebRequest.BeginGetResponse,它将异步获取您的资源,而无需自己管理线程。

答案 1 :(得分:1)

我不是Webbrowser控件的专家,但两周前我刚刚做了同样的事情。问题在于,当你告诉Webbrowser做某事时(比如Navigate,或点击一个按钮),它必须关闭并完成其工作,包括可能等待网站响应其请求。这一切都发生在异步中,因此使用Navigate调用多次敲击它几乎肯定会失败。

你需要做的是让它工作(导航等),然后退出你当前的线程,等待Webbrowser完成你要求它做的事情,然后通过举起一个事件告诉你,< em>然后你可以进入下一步。

所以我做的是让一个对象维护一个状态,并根据当前状态,它对Webbrowser做了一些事情,推进状态,然后退出线程。

我有另一个对象(实际上是Form)接收来自Webbrowser的所有事件,确定一个事件意味着它是“完成”加载然后再次重新调用第一个对象。