Domanda

Ho un IE BHO che è in fase di sviluppo in C #. Si suppone che attendere che l'utente di fare alcune cose, contattare il nostro server e scaricare alcuni dati, e quindi modificare il DOM della pagina web attualmente caricata con i risultati.

Sono in esecuzione in alcuni problemi apparentemente insormontabili relativi alle norme di COM compartimentazione e filettatura - vale a dire, non posso sembrare accesso IE DOMDocument al di fuori del thread corrente e non riesco a pensare a un modo per eseguire qualcosa asincrono senza bloccarsi IE finché non è finito.

Il mio primo tentativo ha avuto la roba sfondo server di comunicazione fare il suo dovere in modo event-driven: il mio programma avrebbe avviato le comunicazioni all'interno di un evento MSHTML (BeforeNaviagate2 o DocumentComplete, per esempio), e sarebbe inviare i risultati all'interno di un gestore di eventi separati sparato da l'oggetto di comunicazione del server quando è finito il suo lavoro.

Questo techniqued ha funzionato bene in un simulatore veloce ho messo insieme (solo una semplice applicazione con un controllo WebBrowser), ma in IE sarebbe un'eccezione COM perché stavo tentando di modificare la pagina DOM tramite un thread separato.

Così ho provato a tenere tutto nella stessa funzione, e avendo il mio codice di attesa per le comunicazioni server oggetti per fare il suo lavoro con un ciclo while, in questo modo:


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

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

    }

Il problema di questo approccio è mentre il codice rimane nel thread originale, esegue synchroniously con il processo di IE è sparato in (in IE8, è un processo per ogni scheda - come Google Chrome - sembra) ... quindi bloccando l'interfaccia di IE fino a completa mie comunicazioni del server.

Inizialmente ho voluto avviare l'elaborazione non appena l'URL era disponibile (tramite evento NavigationComplete2), ma ho scoperto che l'attesa per il tag per diventare disponibile dovrebbe finire le mie comunicazioni server prima page dell'utente caricato sarebbe anche bloccare IE -. gettandolo in un ciclo infinito mentre il mio codice attende per il corpo HTML, mentre la pagina viene impedito di aggiornarsi fare per il loop di cui sopra

Ci ho pensato spostare tutto questo in page dell'utente attuale javascript ma sembra che così facendo sto aprendo un vaso di Pandora in dispute con problemi di sicurezza XSS.

Quindi ... la mia domanda è tale: è possibile eseguire codice asynchroniously in C # IE BHO pur essendo in grado di manipolare la pagina DOM dell'utente? Ho chiesto in giro con gli amici e la maggior parte delle persone mi dicono che non è probabile. Sono ancora un principiante COM e C #, essendo venuto da C / VB.net / JS / AS.

Grazie!

-Tom

È stato utile?

Soluzione

È necessario il marshalling l'oggetto DOM dal thread è stato creato al proprio thread di lavoro. Qui è una ripartizione molto dettagliata di come COM e C # giocare insieme.

Tutti gli oggetti DOM IE sono oggetti STA.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top