Web浏览器控制单独的线程 - VB.Net

时间:2016-11-25 17:23:20

标签: vb.net multithreading webbrowser-control sta

我有一个Outlook加载项,其中包含一个Web浏览器控件,该控件是目前用户控件的一部分,我正在加载此加载项的网页onload。因此,它到目前为止工作正常,但是,当页面加载时间很长时,它会使UI无法继续工作。 所以,我的问题是,我可以从用户控件转移该Web浏览器控件,并创建一个具有此Web浏览器控件的单独线程,并在该线程中执行所有Web浏览器加载。这样,当控件花费时间加载时,用户可以继续他们的工作。

我在这篇文章中一直在阅读这种方法:WebBrowser Control in a new thread

但我正在努力将此重用于我的特定用例。有人可以用这种方法帮助我吗? 我也在这里发布了我的代码:

Web browser control loading Outlook unusable VB.Net

2 个答案:

答案 0 :(得分:0)

我知道这不是太多,但你可以尝试这样的事情:

声明一个帖子:

Private ThreadBrowse As Threading.Thread

然后开始:

Private Sub StartNavigate
    ThreadBrowse = New System.Threading.Thread(AddressOf TheWork)
    ThreadBrowse.SetApartmentState(Threading.ApartmentState.STA)
    ThreadBrowse.Start()
End Sub

这是线程将要执行的子操作:

Private Sub TheWork()
   Dim IsFinish As Boolean = False
   WebBrowser1.Navigate(New Uri("http://stackoverflow.com"))

Recheck:
    WebBrowser1.InvokeCustom(Sub() IsFinish = (WebBrowser1.ReadyState = WebBrowserReadyState.Complete))
    If IsFinish = False Then
        Threading.Thread.Sleep(100)
        GoTo Recheck
    End If
End Sub

别忘了把他放在一个模块中:

<Runtime.CompilerServices.Extension()>
Public Sub InvokeCustom(ByVal Control As Control, ByVal Action As Action)
    If Control.InvokeRequired Then Control.Invoke(New MethodInvoker(Sub() Action()), Nothing) Else Action.Invoke()
End Sub

也许你可以用这个基本代码做得更好,体贴像“启动”:D

答案 1 :(得分:0)

您是否尝试将网络浏览器代码放在单独的类中,然后调用代码?