首先我有这个按钮点击事件:
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&lt; 45
getCurrentBrowser方法:
private WebBrowser getCurrentBrowser()
{
return (WebBrowser)browserTabControl.SelectedTab.Controls[0];
}
然后在load 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源内容的硬盘上创建一个文件。 但是我遇到了两个问题:
在已完成的事件中,它会一直调用已完成的事件并反复创建html文件,直到加载了该codument。我怎么能在完成的活动中做到这一点?我的意思是它会等待加载的dosument,然后写入文件并只创建一次文件?
当循环为i < 45
而非2
时,如何全部完成?
因此它将等待第一个html被加载然后在完成写入时写入文件使循环中的下一个html再次在已完成的事件中写入,依此类推,因此它不会相互移动。
Web浏览器文档的已完成事件与其他已完成的事件不同,它每隔一秒左右一直调用已完成的事件,直到完成加载html为止。
答案 0 :(得分:1)
我不确定WebBrowser
在这种情况下的目的是什么。该控件用于人工交互,而不是加载X个站点。
我建议使用HttpWebRequest
或更新的WebClient
课程。在您显示的情况下,这更容易使用。
WebClient
类可以像这样使用:
WebClient wc = new WebClient();
string html = wc.DownloadString("yourUrl");
这将等待请求完成并返回结果。不需要事件处理程序等。您可以使用async
来提高性能。