【问题标题】:Wait for webBrowser control to fully load等待 webBrowser 控件完全加载
【发布时间】:2013-10-31 13:38:55
【问题描述】:

我目前在WinForm 中使用webBrowser control -

public Form1()
        {
            InitializeComponent();

            webBrowser1.AllowNavigation = true;
            webBrowser1.Navigate("http://foo.bar");        
        }

我有一个按钮控件,它采用 webBrowser1.Url.OriginalString 并将其设置为文本框 -

// On button_Click
string requestResponse = webBrowser1.Url.OriginalString;
requestURLtextBox.Text = requestResponse;

但是,如果在 webBrowser1 有足够的时间获取 OriginalString 文本之前单击按钮,则会出错,因为该值尚不存在。

我尝试添加 -

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
      Thread.Sleep(1000);  
}

在 button_Click 事件中的前一个代码之前,这进入了一个无限循环。 webBrowser完成后如何找回OriginalString

【问题讨论】:

  • Similar Question :看起来你想要 DocumentCompleted 事件
  • +1 表示DocumentCompleted。使用async/await就可以使用easier,VB.NET也有这个功能。

标签: c# winforms webbrowser-control


【解决方案1】:

这里有一些可能对你有用的 VB 简单代码:

    If mbBusy Then Exit Function ' form level variable
    mbBusy = True
    Web.Navigate("http://.....htm")
    dtWebWait = Now().AddSeconds(timeoutSeconds)
    Do Until Web.ReadyState = WebBrowserReadyState.Complete
        Application.DoEvents()
        If Now() > dtWebWait Then
            MsgBox("navigate timeout - search form")
            Exit Function
        End If
        Threading.Thread.Sleep(250)
    Loop
    mbBusy = False

【讨论】:

  • 这是busy waiting,您的 CPU 中至少有一个核心会以 100% 的速度巡航。应该避免这种模式。
  • 我同意这不是一个好的技术解决方案,但可以完成简单任务的工作。问题 - 如果内部循环中有等待/睡眠,等待/睡眠会阻止网络浏览器吗?
  • 只要Application.DoEvents 仍然被调用,在循环内像 100-200 毫秒这样的短暂睡眠会在一定程度上缓解繁忙的等待并且不会阻塞浏览器。但是嵌套消息循环的潜在问题,如代码重入,将一直持续到循环结束。
  • @Noseratio 添加的(上面代码中的编辑)忙碌标志和睡眠会收紧吗?
  • 是的,它确实改善了一些事情。如果您想走得更远一点,请查看here 中的Wait 实现,它使用了一个可等待的计时器和MsgWaitForMultipleObjects。使用这样的Wait 而不是Thread.Sleep 会更有效,因为一旦队列中有消息供DoEvents 接收,它就会返回。然而,这不会消除potential issues with DoEvents,因为DocumentCompleted 的异步处理会。无论如何,为你的努力 +1。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2011-12-23
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2011-10-11
  • 2019-02-10
  • 1970-01-01
相关资源
最近更新 更多