2012-01-17 22 views
1

MyApp.exeの0x0e90a1c0で処理されない例外:0xC0000005:アクセス違反。WebBrowserコントロールを別のスレッドで実行すると、ランタイムエラーが発生するのはなぜですか?

投稿に基づいてHow might I create and use a WebBrowser control on a worker thread?私は別のスレッドでWebPagePumpクラスを実行しようとしています。

for (int i = 0; i < 5; i++) 
{ 
    Thread t = new Thread(delegate() { WebNav1(); }); 
    t.Start(); 
} 

private Action WebNav1 = delegate() 
{ 
    WebPagePump a = new WebPagePump(); 
    a.Navigate(new Uri("http://www.mywebsite.com")); 
    a.Completed += delegate(WebBrowser wb) 
     { 
      Console.WriteLine("It's loaded!"); 
      a.Dispose(); 
     }; 
}; 
+0

は見慣れ。 WebPagePumpのポイントはあなた自身のスレッドを開始する必要はありませんでした。あなたがまだ問題を抱えているなら、 'new Thread'を取り除き、スタックトレースを投稿してください。 –

答えて

2

あなたはシングルスレッドアパートメントを指定する必要があります。

Thread t = new Thread(delegate() { WebNav1(); }); 
t.ApartmentState = ApartmentState.STA; 
t.Start(); 
+0

これは問題を解決するかもしれませんが、これは特に有用な答えではありません。 **なぜあなたはシングルスレッドアパートメントが必要ですか? –

+0

これはUIコントロールのスレッドモデルです。レガシーの理由からActiveXの仕様の一部。そして、Webブラウザコントロールは内部的に推測されます - IE;)ActiveXコントロール。これは20年間の標準的なWindows制御の知識であり、それでもなお、後輩からの高齢者を悲しいほど除外する質問の1つです。 – TomTom

+0

+1。あなたのコメントに答えるにはhttp://msdn.microsoft.com/en-us/library/3s8xdz5c.aspx "Windowsフォームは本来アパート型のネイティブWin32ウィンドウに基づいているため、Windowsフォームはシングルスレッドアパートメント(STA)モデルを使用します。 STAモデルは、任意のスレッドでウィンドウを作成できますが、作成されたスレッドを切り替えることはできず、すべての関数呼び出しは作成スレッドで発生する必要があることを意味します " –

関連する問題