我有一个 WebBrowser 控件,它是从后台 STA 线程动态实例化的,因为父线程是 BackgroundWorker 并且还有很多其他事情要做。
问题是导航事件永远不会触发,除非我在告诉它.Navigate() 的方法中弹出一个MessageBox.Show()。我将解释:
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 和从属线程......虽然以牺牲响应性为代价:(