親スレッドは 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とスレーブスレッドをまったく使用しないことになりました...応答性を犠牲にしていますが:(