WebBrowser.Navigated只有当激发我的MessageBox.show();
-
21-08-2019 - |
题
我有正被从后台STA线程动态实例web浏览器的控制,因为父线程是一个BackgroundWorker和有许多其他的事情要做。
的问题是,导航的事件永远不会触发,除非我弹出一个MessageBox.Show()在方法告诉它.Navigate()。我将说明:
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将得到的方式,因为这是一个自动化的应用程序。当我删除MessageBox.Show()时,WebBrowser.Navigated事件永远不会触发。我已经试过排挤掉这条线与Thread.sleep代码(),并通过暂停父线程。
一旦我得到了这一点的方式,我打算暂停父线程,而在WebBrowser正在做其工作,并找到使所得到的HTML返回到父线程,以便它可以与其它逻辑继续的某种方式。
它为什么要这样做呢?我怎样才能解决这个问题?的
如果有人能为我提供了一种方法来抓取网页的内容,填写了一些数据,并返回页面的内容提交按钮的另一面,对所有不支持Web服务器POST动词也通过查询字符串传递数据,我也会接受的答案,这整个演习将一直不必要的。
解决方案:最后我只是没有使用BackgroundWorker和从属线程都在团队建筑师的建议...虽然在响应的费用:(
其他提示
如果web浏览器的可见性设置为false导航的和一个DocumentComplete事件将不会触发。您可以解决此限制通过使WebBrowser控件可见,但其设置的位置,使得它像用户界面之外:
wb.Visible = true;
wb.Left = -wb.Width; // notice the minus sign
您需要添加一行是这样的:
webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);
其中webBrowswer1_Navigated
是你要调用的函数,当事件触发。
时有一个GUI线程已经开始?也许WebBrowser对象使用一个GUI线程来处理事件。在这种情况下,你应该从创建web浏览器(更换你的MessageBox.Show()与此)的线程中调用Application.Run()。 Application.Run()将挂起,直到Application.Exit()被调用。
正在尝试进行测试。
最后我只是没有使用BackgroundWorker和从属线程都在团队建筑师的建议...虽然在响应为代价:(
如果它不是处于STA线程A web浏览器控件不能工作。如果你想在你需要创建线程和线程使用web浏览器实例调用Thread.SetApartmentState(ApartmentState.STA);