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

问题描述:

我有一个Outlook加载项,其中包含一个Web浏览器控件,此时是用户控件的一部分,我正在加载此加载项的一个网页onload。所以,到目前为止,它工作正常,但是,当页面需要很长时间才能加载时,它使用户界面无法继续工作。 所以,我的问题确实是,我可以将该Web浏览器控件从用户控件中移出,并创建一个具有此Web浏览器控件的独立线程,并在该线程中加载所有Web浏览器。这样,当控制器花时间加载时,用户可以继续他们的工作。Web浏览器控件单独线程 - VB.Net

我一直在阅读有关在这个岗位这种做法:WebBrowser Control in a new thread

但我在努力重用此我特别的使用情况。有人可以帮助我采用这种方法吗? 我已经张贴在这里我的代码,以及:

Web browser control loading Outlook unusable VB.Net

+2

您原来的问题有一个很好的评论:“在问题中缺乏细节来帮助您”。重复这个问题,并显示更少的细节不是一个聪明的方式来使用这个网站。 –

+1

您能否让我知道我错过了哪些信息?我非常乐意添加更多细节:)。实际上,我在其他帖子中添加了大部分代码。不知道还有什么更多的代码添加。 – Neophile

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

声明线程:

Private ThreadBrowse As Threading.Thread 

然后启动它:

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

This是一个子线程就会做:

Private Sub TheWork() 
    Dim IsFinish As Boolean = False 
    WebBrowser1.Navigate(New Uri("http://*.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

+0

我可以使用我现有的浏览器控件来做到这一点吗?我确实尝试过类似的东西,但是使用我现有的webbrowser控件(即在用户控件下)并不真正起作用。我猜我需要在线程中创建Web浏览器实例,然后始终在线程中运行Web浏览器控件。这会起作用吗? – Neophile

+0

是的,您可以使用任何控件,只需用您的网页浏览器或您的控件替换“WebBrowser1”即可。 直接在线程中创建webbrowser ... mmh我必须说这有点复杂,不是不可能,但很复杂。我也遇到了这个问题,其他人控制是好的,但是对于webbrowser是......“奇怪”:D 无论如何测试这段代码并让我知道。 – Tyler

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

+0

不,你可以添加一些代码来支持你的答案,然后我可以尝试一下。 – Neophile