我有44个html地址,我希望每次都能导航到一个html地址。
for (int i = 1; i < 45; i++)
{
adrBarTextBox.Text = sourceUrl + i;
getCurrentBrowser().Navigate(adrBarTextBox.Text);
}
在webbrowser文档已完成的事件中,我只需要完成导航和加载所有页面,包括javascript和所有内容,然后导航到下一个html地址。
private void Form1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// If page loaded completly then do something
}
问题在于,循环将尝试在每次加载最后一页之前的新页面html之前以及在完成的事件中使用它之前导航。
修改
按钮点击事件:
private void toolStripButton3_Click(object sender, EventArgs e)
{
GetHtmls();
CheckQueue();
}
然后是GetHtmls方法:
private Queue<Uri> myUrls = new Queue<Uri>();
private bool isBusy = false;
private void GetHtmls()
{
for (int i = 1; i < 45; i++)
{
adrBarTextBox.Text = sourceUrl + i;
targetHtmls = (combinedHtmlsDir + "\\Html" + i + ".txt");
Uri targetUri = new Uri(sourceUrl + i);
myUrls.Enqueue(targetUri);
}
}
然后是checkQueue方法:
private void CheckQueue()
{
if (isBusy)
return; // We're downloading some page right now, don't disturb
isBusy = true; // OK, let's get started
if (myUrls.Count == 0) // No more pages to download, we're done
{
isBusy = false;
return;
}
Uri uri = myUrls.Dequeue(); // Get one URL from queue
getCurrentBrowser().Navigate(uri);
}
最后完成的活动:
private void Form1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
myUrls.Dequeue();
// If page loaded completly then do something
isBusy = false; // We're done
CheckQueue(); // Check next page in queue
}
答案 0 :(得分:0)
您可以使用 TaskCompletionSource + async/await 进行此操作
TaskCompletionSource<object> tcs = null;
webBrowser1.DocumentCompleted += (s, e) =>
{
tcs.TrySetResult(null);
};
for (int i = 1; i < 45; i++)
{
tcs = new TaskCompletionSource<object>();
webBrowser1.Navigate(sourceUrl + i);
await tcs.Task;
//... Navigation completed ...
}
PS:不要忘记将方法标记为 async
答案 1 :(得分:0)
您在循环的同时导航到所有页面。在我看来,你需要一个队列,当下载一个页面时将会检查它。
private Queue<Uri> myUrls = new Queue<Uri>();
private bool isBusy = false;
isBusy
标志将用于我们的下一个方法,因为我们只想一次下载一个页面。
private void CheckQueue()
{
if (isBusy)
return; // We're downloading some page right now, don't disturb
isBusy = true; // OK, let's get started
if (myUrls.Count == 0) // No more pages to download, we're done
{
isBusy = false;
return;
}
Uri uri = myUrls.Dequeue(); // Get one URL from queue
webBrowser.Navigate(uri); // Download the page
}
我们将在下载一个页面时调用此方法。
private void Form1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// If page loaded completly then do something
isBusy = false; // We're done
CheckQueue(); // Check next page in queue
}
当然,您必须致电CheckQueue()
来初始化下载页面的过程。