【问题标题】:How do I know when a website finished loaded into WebBrowser?我如何知道网站何时完成加载到 WebBrowser?
【发布时间】:2015-02-23 03:39:16
【问题描述】:

首先我有这个按钮点击事件:

private void toolStripButton3_Click(object sender, EventArgs e)
{
    GetHtmls();
}

然后是GetHtmls方法:

private void GetHtmls()
{
    for (int i = 1; i < 2; i++)
    {
        adrBarTextBox.Text = sourceUrl + i;
        getCurrentBrowser().Navigate(adrBarTextBox.Text);
        targetHtmls = (combinedHtmlsDir + "\\Html" + i + ".txt");
    }
}

现在循环用于一个 html,但稍后我会将循环更改为 i

getCurrentBrowser 方法:

private WebBrowser getCurrentBrowser()
{
    return (WebBrowser)browserTabControl.SelectedTab.Controls[0];
}

然后在加载 form1 事件中我有:

browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(Form1_DocumentCompleted);

还有完成的事件:

private void Form1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser currentBrowser = getCurrentBrowser();           
    StreamWriter writer = File.CreateText(targetHtmls);
    writer.Write(getCurrentBrowser().DocumentText);
    writer.Close();
}

我在这里所做的是将 html 加载到 Web 浏览器并在 html 源内容的硬盘上创建一个文件。 但我遇到了两个问题:

  1. 在完成的事件中,它不断调用完成的事件并一遍又一遍地创建 html 文件,直到加载 codument。我怎样才能让它在完成的活动中完成一次?我的意思是它会等到文件加载完毕,然后写入文件并只创建一次文件?

  2. 当循环将是 i &lt; 45 而不是 2 时,我如何做到这一点? 所以它会等待第一个 html 被加载,然后在完成写入时写入文件,在循环中创建下一个 html,然后在完成的事件中再次写入,依此类推,这样它就不会相互移动。

网络浏览器文档的完成事件与其他完成事件不同,它每秒左右调用完成事件,直到完成加载 html。

【问题讨论】:

    标签: c# .net winforms webbrowser-control


    【解决方案1】:

    我不确定在这种情况下WebBrowser 的目的是什么。该控件用于人工交互,而不是加载 X 个站点。

    我建议使用HttpWebRequest 或更新的WebClient 类。在您在此处显示的情况下,这更容易使用。

    WebClient 类可以这样使用:

    WebClient wc = new WebClient();
    string html = wc.DownloadString("yourUrl");
    

    这将等到请求完成并返回结果。不需要事件处理程序等。不过,您可以使用async 来提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多