2010-09-25 64 views
8

我想暂停执行我的线程,直到一个特定的div已经通过ajax加载到WebBrowser实例中。很显然,我可以不断地检查这个存在DIV做这样的事情:等待WebBrowser ajax内容

while (Browser.Document.GetElementById("divid") == null) { Thread.Sleep(200); } 

然而,睡眠线程的浏览器是在环路之间仅几个街区从实际加载在首位的内容浏览器。因此,似乎我需要在单独的线程中执行Browser.Navigate方法 - 然后我可以继续检查/等待div的存在,同时WebBrowser实例继续加载我要求的URL。

但是,我在这方面的尝试失败了,我很想看看我应该如何去做这件事。我认为简单地调用一个new Thread(() => { Browser.Navigate(url); });的新线程可以工作,但这样做后,没有任何加载和Browser.ReadyState保持为'未初始化'。我猜想我误解了如何正确地使用C#编写这样的程序,并会重视一些建议!

+0

参见[WebBrowser控件=等待为页面加载完成](http://social.msdn.microsoft.com/Forums/windows/en-US/9e5d265c-8771-433c-a2aa-91b4eeb1d684/webbrowser-control-wait-for-page-load-to -complete功能于一个组件?论坛=的WinForms)。它说 - 调用'System.Windows.Forms.Application.DoEvents()'。 – Lijo 2014-03-27 14:09:13

回答

5

不要阻塞主线程的消息泵。由于浏览器是STA组件,因此如果阻止消息泵,xmlhttprequest将无法从后台线程中引发事件。 您无法在后台线程中导航。 webbrowser ActiveX的Windows窗体包装不支持除UI线程以外的其他线程的访问。请改用计时器。

+0

您能否详细说明计时器方法?我们可以在发射DocumentCompleted事件之前添加1秒的延迟吗? – Lijo 2014-03-27 13:55:18

+1

不,但您可以启动计时器,然后在其tick事件中解析文档,假定ajax操作在计时器滴答之前结束。请记住,当您完成解析后停止定时器。 – 2014-03-28 04:10:26

8

以下应该工作,

while (Browser.Document.GetElementById("divid") == null) 
{ 
    Application.DoEvents(); 
    Thread.Sleep(200); 
} 

以上为我工作...

+0

我做了一些类似的尝试,但最终使用了盛江的方法。这似乎是更正确的做法。 – JoeR 2010-10-31 17:13:36

+0

如果div未完全加载,该怎么办? – 2016-06-29 14:05:43

1

你可以找到一个文本体,例如:

while (HtmlWindow.Document.Body.InnerHtml.Contains(some_text) == false) 
{   
    Application.DoEvents(); 
    Thread.Sleep(200); 
}