2016-11-25 2 views
1

J'ai un add-in Outlook qui contient un contrôle de navigateur Web qui fait partie du contrôle de l'utilisateur pour le moment et je charge une page Web de ce complément. Donc, cela fonctionne très bien jusqu'ici, cependant, quand la page est longue à charger, cela rend l'interface utilisateur inutilisable pour que l'utilisateur continue son travail. Donc, ma question est vraiment, puis-je déplacer ce contrôle du navigateur Web à partir du contrôle de l'utilisateur et créer un thread séparé qui a ce contrôle du navigateur Web et faire tout le navigateur web de chargement dans ce thread. De cette façon, pendant que le contrôle prend son temps à charger, l'utilisateur peut continuer son travail.Fil de discussion séparé du navigateur Web - VB.Net

Je lis à propos de cette approche dans ce post: WebBrowser Control in a new thread

Mais je me bats pour réutiliser pour mon cas particulier d'utilisation. Quelqu'un pourrait-il m'aider avec cette approche? J'ai posté mon code ici aussi:

Web browser control loading Outlook unusable VB.Net

+2

Votre question originale a un bon commentaire: "Il y a un manque de détails dans la question pour vous aider". Répéter la question et montrer encore moins de détails n'est pas une façon intelligente d'utiliser ce site Web. –

+1

Pourriez-vous s'il vous plaît laissez-moi savoir quelles informations me manquent? Je suis plus qu'heureux d'ajouter plus de détails :). J'ai ajouté la plupart de mon code dans l'autre article. Je ne sais pas quoi ajouter en termes de code. – Neophile

Répondre

0

Je sais que ce n'est pas trop, mais vous pouvez essayer quelque chose comme ça:

Déclare un fil:

Private ThreadBrowse As Threading.Thread 

puis commencer:

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

Cette est un sous que le fil fera:

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 

Ne pas oublier de mettre son dans un module:

<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 

Peut-être que vous pouvez faire mieux avec ce code de base, prévenant comme un « démarrage » : D

+0

Serais-je capable d'utiliser mon contrôle webbrowser existant pour faire ceci? J'ai essayé quelque chose de similaire mais en utilisant mon contrôle webbrowser existant (qui est sous le contrôle de l'utilisateur) ne fonctionne pas vraiment. Je devine que je devrais créer l'instance de navigateur Web dans le fil, puis exécutez toujours le contrôle du navigateur Web dans le fil. Cela fonctionnerait-il? – Neophile

+0

Oui, vous pouvez utiliser pour tout contrôle, il suffit de remplacer "WebBrowser1" avec votre webbrowser ou votre contrôle. Pour créer un webbrowser directement dans un thread ... mmh je dois dire que c'est un peu compliqué, pas impossible mais compliqué. J'ai couru dans ce problème aussi, avec d'autres contrôle est ok, mais pour un webbrowser est ... "étrange": D En tout cas tester ce code et faites le moi savoir. – Tyler

0

Avez-vous essayé de placer le code du navigateur Web dans une classe distincte, puis d'appeler le code?

+0

Non, pouvez-vous ajouter du code pour soutenir votre réponse et puis je peux l'essayer. – Neophile