我有正被从后台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和从属线程都在团队建筑师的建议...虽然在响应的费用:(

有帮助吗?

解决方案

WebBrowser不会做太多,除非它被示出,并且具有相关联的UI线程;你出其所处的形式?你需要,使用DOM等形式可以关闭屏幕,如果你不希望它显示给用户,但它不会在服务工作良好(例如)。

有关刮目的,就可以正常使用模拟等WebClient这是不够的一个普通的HTML browwser?您可以使用诸如“提琴手”工具来调查你需要到服务器的精确要求。对于还不止这些,你可能看 HTML敏捷性包,它提供了对HTML DOM访问无浏览器。

其他提示

如果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);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top