在后台线程中创建一个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
答案 0 :(得分:2)
使用WebRequest而不是WebBrowser
您可以更改您的实现以使用WebRequest.BeginGetResponse,它将异步获取您的资源,而无需自己管理线程。
答案 1 :(得分:1)
我不是Webbrowser控件的专家,但两周前我刚刚做了同样的事情。问题在于,当你告诉Webbrowser做某事时(比如Navigate,或点击一个按钮),它必须关闭并完成其工作,包括可能等待网站响应其请求。这一切都发生在异步中,因此使用Navigate调用多次敲击它几乎肯定会失败。
你需要做的是让它工作(导航等),然后退出你当前的线程,等待Webbrowser完成你要求它做的事情,然后通过举起一个事件告诉你,< em>然后你可以进入下一步。
所以我做的是让一个对象维护一个状态,并根据当前状态,它对Webbrowser做了一些事情,推进状态,然后退出线程。
我有另一个对象(实际上是Form)接收来自Webbrowser的所有事件,确定一个事件意味着它是“完成”加载然后再次重新调用第一个对象。