要收集网页上的信息,我可以使用该WebBrowser.Navigated
事件。
首先,导航到网址:
WebBrowser wbCourseOverview = new WebBrowser();
wbCourseOverview.ScriptErrorsSuppressed = true;
wbCourseOverview.Navigate(url);
wbCourseOverview.Navigated += wbCourseOverview_Navigated;
Navigated
然后在调用时处理网页:
void wbCourseOverview_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
//Find the control and invoke "Click" event...
}
当我尝试遍历一个字符串数组时,困难的部分就来了。
foreach (var u in courseUrls)
{
WebBrowser wbCourseOverview = new WebBrowser();
wbCourseOverview.ScriptErrorsSuppressed = true;
wbCourseOverview.Navigate(u);
wbCourseOverview.Navigated += wbCourseOverview_Navigated;
}
在这里,因为页面加载需要时间,wbCourseOverview_Navigated
所以永远不会到达。
我尝试async
await
在 C#5 中使用。任务和基于事件的异步模式 (EAP) 可在此处找到。另一个例子可以在基于任务的异步模式中找到。
问题是WebClient
有 async 方法,比如DownloadDataAsync
and DownloadStringAsync
。但是里面没有NavigateAsync
。WebBrowser
有哪位高手能给我一些建议吗?谢谢你。
StackOverflow 中有一篇文章(这里)。但是,有谁知道如何strut
在其答案中实现它?
再次更新。
在 StackOverflow的另一篇文章中建议,
public static Task WhenDocumentCompleted(this WebBrowser browser)
{
var tcs = new TaskCompletionSource<bool>();
browser.DocumentCompleted += (s, args) => tcs.SetResult(true);
return tcs.Task;
}
所以我有:
foreach (var c in courseBriefs)
{
wbCourseOverview.Navigate(c.Url);
await wbCourseOverview.WhenDocumentCompleted();
}
在我的网络浏览器访问第二个网址之前,它看起来不错。
尝试在任务已完成时将其转换为最终状态。
我知道我一定在foreach
循环内犯了一个错误。因为DocumentCompleted
事件循环到第二轮时还没有引发。await
在foreach
循环中写这个的正确方法是什么?