Automatisation du navigateur Web: assurer la fin de la navigation sur un thread séparé
L'automatisation de la navigation Web avec un contrôle WebBrowser dans un fil séparé présente souvent des défis avec la détection de l'achèvement de la charge de document. L'événement DocumentCompleted
peut ne pas se déclencher avant la fin du thread, empêchant l'accès au document chargé.
La solution: en utilisant un thread STA
La clé pour résoudre ceci est l'utilisation d'un thread d'appartement (STA) unique (STA) et d'une boucle de message. Les threads STA fournissent l'environnement nécessaire pour les composants ActiveX comme WebBrowser. Voici comment implémenter ceci:
<code class="language-csharp">private void StartBrowserThread(Uri url) { var thread = new Thread(() => { var webBrowser = new WebBrowser(); webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted; webBrowser.Navigate(url); Application.Run(); // Essential for the message loop }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var webBrowser = (WebBrowser)sender; if (webBrowser.Url == e.Url) { Console.WriteLine($"Navigated to: {e.Url}"); Application.ExitThread(); // Safely stops the thread } }</code>
Cette méthode StartBrowserThread
crée un thread STA. Application.Run()
initie une pompe de message, cruciale pour la gestion des événements du contrôle WebBrowser. Le gestionnaire d'événements WebBrowser_DocumentCompleted
confirme l'achèvement de la navigation, enregistre l'URL, puis termine le thread à l'aide de Application.ExitThread()
, assurant une gestion des ressources propres.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!