0

親スレッドは BackgroundWorker であり、他にもやるべきことがたくさんあるため、バックグラウンド STA スレッドから動的にインスタンス化されている WebBrowser コントロールがあります。

問題は、.Navigate() に指示したメソッドで MessageBox.Show() をポップしない限り、Navigated イベントが発生しないことです。私は説明します:

ThreadStart ts = new ThreadStart(GetLandingPageContent_ChildThread);
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Name = "Mailbox Processor";
t.Start();

protected void GetLandingPageContent_ChildThread()
{
 WebBrowser wb = new WebBrowser();
 wb.Navigated += new WebBrowserNavigatedEventHandler(wb_Navigated);
 wb.Navigate(_url);
 MessageBox.Show("W00t");
}

protected void wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
 WebBrowser wb = (WebBrowser)sender; // Breakpoint
 HtmlDocument hDoc = wb.Document;
}

これは正常に機能します。ただし、これは自動化アプリであるため、メッセージ ボックスが邪魔になります。MessageBox.Show() を削除すると、WebBrowser.Navigated イベントが発生しません。この行を Thread.Sleep() に置き換え、親スレッドを中断してみました。

これを片付けたら、WebBrowser がその仕事をしている間に親スレッドを一時停止し、結果の HTML を親スレッドに戻す何らかの方法を見つけて、さらにロジックを続行できるようにします。

なぜこれを行うのですか?どうすれば修正できますか?

POST動詞もQueryString を介してデータを渡す場合、この演習全体が不要になるため、その答えも受け入れます。


解決策:チームアーキテクトの提案で、BackgroundWorkerとスレーブスレッドをまったく使用しないことになりました...応答性を犠牲にしていますが:(

4

6 に答える 6

2

WebBrowser表示され、UI スレッドが関連付けられていない限り、あまり効果がありません。それが存在するフォームを表示していますか?DOMなどを使用する必要があります。フォームをユーザーに表示したくない場合は、フォームを画面外に表示できますが、サービスではうまく機能しません(たとえば)。

スクレイピングの目的で、通常、etc を使用して通常の HTML ブラウザをシミュレートできますWebClient。これでは不十分ですか? 「 Fiddler 」などのツールを使用して、サーバーに対して行う必要がある正確な要求を調査できます。それ以上のものについては、ブラウザーなしで HTML への DOM アクセスを提供するHTML Agility Packを見ることができます。

于 2008-12-15T20:37:42.670 に答える
1

次のような行を追加する必要があります。

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

webBrowswer1_Navigatedイベントが発生したときに呼び出す関数はどこにありますか。

于 2010-05-29T03:44:48.987 に答える
0

GUI スレッドは既に開始されていますか? おそらく、WebBrowser オブジェクトは GUI スレッドを使用してイベントを処理します。その場合、WebBrowser を作成するスレッドから Application.Run() を呼び出す必要があります (MessageBox.Show() をこれに置き換えます)。Application.Run() は、Application.Exit() が呼び出されるまでハングします。

これを今テストしようとしています。

于 2008-12-15T20:41:04.020 に答える
0

チームアーキテクトの提案で、BackgroundWorkerとスレーブスレッドをまったく使用しないことになりました...応答性を犠牲にしていますが:(

于 2008-12-16T20:35:09.443 に答える
0

STA スレッドにない場合、WebBrowser コントロールは機能しません。スレッドで WebBrowser インスタンスを使用する場合は、スレッドを作成して呼び出す必要がありますThread.SetApartmentState(ApartmentState.STA);

于 2012-05-02T17:27:24.930 に答える