我如何每次使用webbrowser导航到一个html页面?

时间:2015-02-24 14:07:46

标签: c# .net winforms

我有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
        }

2 个答案:

答案 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()来初始化下载页面的过程。