代码之家  ›  专栏  ›  技术社区  ›  Jim

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

  •  0
  • Jim  · 技术社区  · 15 年前

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

    注意:这是类的一部分,您可以在其中看到me.url或me。… me.isrunning=默认情况下布尔值为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 回复  |  直到 15 年前
        1
  •  2
  •   gn22    15 年前

    使用 WebRequest 而不是韦布罗瑟

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

        2
  •  1
  •   RBarryYoung    15 年前

    我不是webbrowser控件的专家,但两周前我也经历过同样的事情。问题是,当你告诉webbrowser做一些事情(比如导航,或者点击一个按钮)时,它必须离开并完成它的工作,可能包括等待网站响应它的请求。这一切都会发生 异步 然而,使用导航调用多次敲打它几乎肯定会失败。

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

    所以我要做的是让一个对象维护一个状态,根据当前状态,它对webbrowser执行一些操作,提升状态,然后退出线程。

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

    推荐文章