2009-04-22 12 views
2

私はC#で開発中のIE BHOを持っています。ユーザーが何かをして、サーバーに接続してデータをダウンロードして、現在ロードされているWebページのDOMを変更して結果を返すのを待つことになっています。C#IE BHO:同じスレッドを維持しながら非同期で動作しますか?

私は、コンパートメントのコンパイルとスレッドのルールに関する一見して克服不可能な問題に遭遇しています。つまり、現在のスレッドの外でIE DOMDocumentにアクセスできないようで、実行する方法は考えられません。終了するまでIEをロックせずに非同期に何かを実行します。

私の最初の試みでは、バックグラウンドでサーバー通信の事柄がイベントドリブンで行われました。私のプログラムはmshtmlイベント(BeforeNaviagate2またはDocumentCompleteなど)内から通信を開始し、サーバ通信オブジェクトがその作業を終了したときに起動される別個のイベントハンドラ。

簡単なシミュレータでうまくいきました(WebBrowserコントロール付きの単純なアプリ)。私は別のスレッドでページDOMを変更しようとしていたので、IEではCOM例外がスローされます。

は、だから私は、同じ機能のすべてを維持し、通信がwhileループでその作業を行うために、オブジェクトサーバーのための私のコード待ちを持ってみました、次のように:


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

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

    } 

このアプローチの問題はしばらくの間ですコードは元のスレッドにとどまり、IEのプロセスと同期して実行されます(IE8ではタブごとに1つのプロセス - Google Chromeのように見えます)...したがって、私のサーバー通信までIEインターフェイスをロックします完了する。

最初に、URLが利用可能になると(NavigationComplete2イベント経由で)処理を開始したいと思っていましたが、ロードされたユーザーのページがロックされる前にサーバ通信が終了すると、<ボディ> IEは - コードがHTML本体を待つ間に無限ループに投げ込みますが、ページはそれ自体を更新することはできません。

これをすべて実際のユーザーのページのJavaScriptに移すことを考えましたが、そのようにすることで、XSSのセキュリティ上の問題を抱えるようなワームを開く可能性があります。

だから私の質問はそうです:C#IE BHOでコードを非同期的に実行することは可能ですが、まだユーザーのページDOMを操作することは可能ですか?私はいくつかの友人の周りに尋ねたし、ほとんどの人はそれがそうでないと私に伝えます。私はまだC/VB.net/JS/ASから来て、COMとC#で新しいです。

ありがとうございました!

-Tom

+0

Tom、これまでにこれを動作させましたか?もしそうなら、コード例がありますか?私は同様の問題に取り組んでおり、非同期にする方法を見つけることができません。周りの仕事として、私はあなたが上記のことを(ループの間に)説明しましたが、これは受け入れられません。ありがとう。 –

+0

私はこのプロジェクトに取り組んでからしばらくしていましたが、サーバーリクエストを別のスレッドに振り向け、DOMを変更してメインのIEスレッドに切り替える直前に問題が解決されたと思います。これにより違反が回避され、ユーザを中断することなくページのDOMにコードが注入されました。スレッドの周りにバウンドする詳細については、こちらをご覧ください:http://stackoverflow.com/questions/2367718/c-automating-the-invokerequired-code-pattern –

答えて

1

は、あなたはそれがあなたのワーカースレッドに作成されたスレッドからDOMオブジェクトをマーシャリングする必要があります。 Hereは、COMとC#が一緒に遊ぶ方法の詳細な内訳です​​。

すべてのIE DOMオブジェクトは、STAオブジェクトです。

+0

ありがとうございます。今読んでいる! –

関連する問題