string urlt = webBrowser1.Url.ToString();
Webbrowser1.Navigate("Google.com")
HtmlElement elem;
if (webBrowser1.Document != null)
{
HtmlElementCollection elems = webBrowser1.Document.GetElementsByTagName("HTML");
if (elems.Count == 1)
{
elem = elems[0];
string pageSource = elem.InnerHtml;
if (pageSource == "404" || pageSource == "Inter" || pageSource == "siteblocked")
{
}
else
{
Ret2.Add("Page.." + "Url..." + urlt);
}
使用上面提到的代码在“DocumentCompleted”事件中阅读WebPage但是如果我是 使用“For循环”获取多个Url每次都不调用DocumentCompleted事件请建议是否有任何好主意。
答案 0 :(得分:3)
来自评论:
..但不支持异步或等待我认为我使用vs2010和i 已经安装了Nuget,但仍然找到async关键字,请 帮助
如果您无法使用async/await
,则无法使用for
循环进行异步WebBrowser
导航,除非使用DoEvents
的弃用黑客。使用state pattern,这就是C#5.0编译器在async/await
场景后面生成的内容。
或者,如果您有足够的冒险精神,可以使用async/await
模拟yield
,如here所述。
更新,下面是另一种利用C#枚举器状态机的方法(与C#2.0及更高版本兼容):
using System;
using System.Collections;
using System.Windows.Forms;
namespace WindowsForms_22296644
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
IEnumerable GetNavigator(string[] urls, MethodInvoker next)
{
WebBrowserDocumentCompletedEventHandler handler =
delegate { next(); };
this.webBrowser.DocumentCompleted += handler;
try
{
foreach (var url in urls)
{
this.webBrowser.Navigate(url);
yield return Type.Missing;
MessageBox.Show(this.webBrowser.Document.Body.OuterHtml);
}
}
finally
{
this.webBrowser.DocumentCompleted -= handler;
}
}
void StartNavigation(string[] urls)
{
IEnumerator enumerator = null;
MethodInvoker next = delegate { enumerator.MoveNext(); };
enumerator = GetNavigator(urls, next).GetEnumerator();
next();
}
private void Form_Load(object sender, EventArgs e)
{
StartNavigation(new[] {
"http://example.com",
"http://example.net",
"http://example.org" });
}
}
}