Question

J'ai un IE BHO qui est dans le développement en C #. Il est censé attendre que l'utilisateur de faire des choses, contactez notre serveur et télécharger des données, puis modifier le DOM de la page Web actuellement chargée des résultats.

Je me présente quelques problèmes apparemment insurmontables liées aux règles de COM compartimentation et le filetage - à savoir, je ne peux pas sembler accéder à l'IE DOMDocument extérieur du thread en cours et je ne peux pas penser à un moyen d'utiliser quelque chose de manière asynchrone sans bloquer IE jusqu'à ce qu'il soit terminé.

Ma première tentative avait l'étoffe serveur communication de fond faire son travail de façon évènementielle: mon programme lancerait des communications à partir d'un événement mshtml (BeforeNaviagate2 ou DocumentComplete, par exemple), et afficherait les résultats à partir d'un gestionnaire d'événement distinct déclenché par l'objet de communication de serveur quand il a terminé son travail.

Ce techniqued a bien fonctionné dans un simulateur rapide, je bricolé (juste une application simple avec un contrôle WebBrowser) mais dans IE il jetterait une exception COM parce que je tentais de modifier DOM page par un thread séparé.

J'ai essayé de garder tout dans la même fonction, et ayant mon code d'attente pour les communications de serveur objet à faire son travail avec une boucle while, comme ceci:


    int waited = 0;
    while (!OurServerCommRequest.ready) {
        System.Threading.Thread.Sleep(1);
        Application.DoEvents();
        waited++;

        if (waited > constants.TIMEOUT_OURSERVER_REQUEST) {
            log.wL("Timed out");
        }

    }

Le problème avec cette approche est alors que le code reste dans le thread d'origine, il exécute synchroniously avec le processus IE, il a tiré en (dans IE8, il est un processus par onglet - comme Google Chrome - il semble) ... donc verrouiller l'interface IE jusqu'à ce que mes communications du serveur se termine.

Au départ, je voulais commencer le traitement dès que l'URL est disponible (via événement NavigationComplete2) mais j'ai découvert que l'attente pour la balise pour devenir disponibles si mes communications de serveur terminer avant chargé la page de l'utilisateur se verrouiller aussi IE -. jetant dans une boucle infinie alors que mon code attend le corps HTML, alors que la page est empêché de se mettre à jour à faire la boucle précitée

J'ai pensé à déplacer tout cela dans la page de l'utilisateur réel javascript mais il semble que, en ce faisant, je vais ouvrir une boîte de Pandore dans des querelles avec des problèmes de sécurité XSS.

Alors ... ma question est telle: est-il possible d'exécuter du code asynchroniously dans un C # IE BHO tout en étant capable de manipuler la page de DOM de l'utilisateur? J'ai demandé autour de quelques amis et la plupart des gens me disent qu'il est peu probable. Je suis encore nouveau à COM et C #, étant venu de C / VB.net / JS / AS.

Merci!

-Tom

Était-ce utile?

La solution

Vous devez rassembler l'objet DOM du fil, il a été créé sur votre thread de travail. est une ventilation très détaillée de la façon dont COM et C # jouer ensemble.

Tous les objets IE DOM sont des objets STA.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top