Contrôle WebBrowser multithread et l'événement documentaire
Lors du traitement de plusieurs URL simultanément, la création d'un contrôle WebBrowser
séparé pour chaque URL dans son propre fil peut sembler efficace. Cependant, cette approche ne déclenche souvent pas l'événement DocumentCompleted
de manière fiable. Cet article explique pourquoi et fournit une solution.
Le problème central réside dans la nature du contrôle WebBrowser
. En tant que composant ActiveX, il nécessite un thread d'appartement (STA) à thread unique pour fonctionner correctement. Le simple fait de démarrer un nouveau fil n'est pas suffisant; Le thread a besoin d'une boucle de message pour traiter les événements. Sans cette boucle de message, l'événement DocumentCompleted
et d'autres événements cruciaux ne sont jamais envoyés.
Voici un exemple de code corrigé démontrant la solution:
<code class="language-csharp">private void RunBrowserThread(Uri url) { var thread = new Thread(() => { var browser = new WebBrowser(); browser.DocumentCompleted += Browser_DocumentCompleted; browser.Navigate(url); Application.Run(); // Crucial: Starts the message loop }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var browser = (WebBrowser)sender; if (browser.Url == e.Url) { Console.WriteLine($"Navigated to {e.Url}"); Application.ExitThread(); // Safely exits the thread } }</code>
Le changement de clé est l'inclusion de Application.Run()
dans l'exécution du thread. Cette ligne démarre la pompe de message, permettant au contrôle WebBrowser
de recevoir et de traiter des événements comme DocumentCompleted
. Le fil quitte ensuite gracieusement en utilisant Application.ExitThread()
une fois la navigation terminée. Cela garantit une gestion appropriée des événements et empêche le comportement d'application inattendu.
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!