Maison > développement back-end > C++ > Pourquoi mon contrôle WebBrowser ne parvient pas à licencier des événements documentaires lorsqu'ils sont utilisés dans un fil séparé?

Pourquoi mon contrôle WebBrowser ne parvient pas à licencier des événements documentaires lorsqu'ils sont utilisés dans un fil séparé?

Patricia Arquette
Libérer: 2025-02-01 21:31:09
original
172 Les gens l'ont consulté

Why Does My WebBrowser Control Fail to Fire DocumentCompleted Events When Used in a Separate Thread?

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal