C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 非同期スレッド内でWebBrowserコントロールを使用


(過去ログ 139 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■81495 / inTopicNo.1)  非同期スレッド内でWebBrowserコントロールを使用
  
□投稿者/ ネピアマスター (1回)-(2016/09/29(Thu) 16:49:31)

分類:[VB.NET/VB2005 以降] 

VB2008 Windows Formアプリケーション

HTMLデータを読み込み、解析・加工する処理を作成したのですが、
これをBackGroundWorkerで非同期処理すると、ThreadStateExceptionが発生しました。

"現在のスレッドはシングル スレッド アパートメントでないため、ActiveX コントロール '8856f961-340a-11d0-a96b-00c04fd705a2' をインスタンス化できません。"

原因は、HTMLデータ解析・加工の際にWebBrowserコントロールを使っているためです。
BackGroundWorker内でWebBrowserの新規インスタンスを作成したとしても、
BackGroundWorkerがMTAであるため、今回の例外が発生することが分かりました。

これを解決するためには、非同期スレッドをThreadクラスで実装し、
このスレッドのApartmentStateをSTAにすれば良さそうですが、
果たしてこれが正しい使い方なのかどうか分かりません。

そこで質問ですが、
(1)上記のように、非同期用のThreadクラスでApartmentStateをSTAとするやり方は「あり」なのでしょうか?
 あるいは、非同期スレッドでWebBrowserを使うという考えは間違っているのでしょうか?

(2)そもそも非同期スレッドでWebBrowserを使っている理由は、
 指定したHTMLタグ種類のコレクション取得が容易であったり
 タグの属性の取得・設定が容易であるためです。
 WebBrowserを使わなくとも、上記を容易に処理できる方法はないでしょうか?

以上、宜しくお願いします。
引用返信 編集キー/
■81498 / inTopicNo.2)  Re[1]: 非同期スレッド内でWebBrowserコントロールを使用
□投稿者/ 魔界の仮面弁士 (917回)-(2016/09/29(Thu) 17:53:54)
No81495 (ネピアマスター さん) に返信
> "現在のスレッドはシングル スレッド アパートメントでないため、ActiveX コントロール '8856f961-340a-11d0-a96b-00c04fd705a2' をインスタンス化できません。"

メッセージループを処理する都合上、ActiveX コントロールの多くは、
シングルスレッド アパートメントを要求します。WebBrowser もそうですね。

メッセージループを必要としないウィンドウレスなコンポーネントだと
マルチスレッドアパートメントなこともありますが。


>  WebBrowserを使わなくとも、上記を容易に処理できる方法はないでしょうか?

WebBrowser を使う以上は、必ずメッセージループが必要になります。

もしも JavaScript 動作やセッション管理等を必要としないのであれば、
Html Agility Pack などといった「HTML パーサー」を使った方が
バックグランド処理には向いています。


> 非同期スレッドでWebBrowserを使うという考えは間違っているのでしょうか?

どうしても WebBrowser が必要なら、たとえば別スレッドで
動作させるのではなく、別プロセスで実行させるという手もあるかも。
引用返信 編集キー/
■81517 / inTopicNo.3)  Re[2]: 非同期スレッド内でWebBrowserコントロールを使用
□投稿者/ ネピアマスター (2回)-(2016/10/03(Mon) 09:55:19)
No81498 (魔界の仮面弁士 さん) に返信

ご回答ありがとうございました。
Html Agility Packを調べてみます。
また、WebBrowserをそのまま使う場合、
別プロセスでの実行も検討します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -