2009-09-13 49 views
56

HTMLページに適用されたCSSスタイルに関する情報を取得する必要があります。私はAxWebBrowserを使用し、IHTMLDOMNodeを繰り返します。私は必要なすべてのデータを取得し、アプリケーションにコードを移すことができます。問題は、この部分がバックグラウンドワーカーの中で実行されていることです。コントロールをインスタンス化しようとすると例外が発生します。シングルスレッドアパートメント - ActiveXコントロールをインスタンス化できません

AxWebBrowser browser = new AxWebBrowser(); 

ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated 
because the current thread is not in a single-threaded apartment. 

AxWebBrowser以外の方法はありますか?

答えて

68

問題は、ほとんどのバックグラウンドスレッド/ワーカーAPIがマルチスレッドアパートメント状態でスレッドを作成することです。エラーメッセージは、コントロールがスレッドをSingle Threaded Apartmentにする必要があることを示します。

これを回避するには、自分でスレッドを作成し、そのスレッドにSTAアパートメントの状態を指定します。

var t = new Thread(MyThreadStartMethod); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 
+1

ありがとう、素晴らしいこれが動作しています。もう1つの質問/問題。私が使用しているクラスは単なるクラスであり、AxWebBrowserはthis.Controls()に追加する必要があるように見えます。コントロールを偽装する方法はありますか?それとも、Formを分けておく必要がありますか? –

+0

@ martin.malekそれを偽造する素晴らしい方法はありません。最善の策は、新しいフォームを作成することです。 – JaredPar

+1

こんにちは、コードはt.SetApartmentState(ApartmentState.STA)でなければなりません。 –

50

先に行くと、あなたのアプリケーションのメインエントリに[STAThread]を追加、これはCOMスレッドモデルがシングルスレッドアパートメント(STA)

例で示しています

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new WebBrowser()); 
    } 
} 
+0

私のコンソールアプリケーションがうまくいき、すばやく解決できるソリューション – Esen

+0

すてきな解決策!ありがとう –

+0

フレームワーク4.5で動作しません - 最後の行に無効な引数を与えます –

3

の場合アプリケーションのメインエントリに[STAThread]を使用しましたが、エラーを受け取りましたスレッドセーフ呼び出しを以下のようにしてください。同じ問題を抱えている私の場合、以下の解決策が働いた!

Private void YourFunc(..) 
{ 
    if (this.InvokeRequired) 
    { 
     Invoke(new MethodInvoker(delegate() 
     { 
      // Call your method YourFunc(..); 
     })); 
    } 
    else 
    { 
     /// 
    } 
+0

ここで何を呼び出す必要がありますか?ブラウザ?どの州?私の場合、ブラウザはダイアログに座っています。 – C4u

関連する問題